静态方法
静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法;
说了那么多,估计会有些懵逼,咱们还是直接上代码看下静态方法怎么使用吧!
1.按照正常逻辑编写代码并加上@staticmethod定义静态方法eat:
1 2 3 4 5 6 7 8 9 10 | |
运行上面代码,我们会发现报以下错误:
TypeError: eat() missing 1 required positional argument: 'self'
----------eat需要一个self参数,但调用时却没有传递
so...我们可以得出一个结论:eat变成静态方法后,再通过实例调用时不会自动把实例本身当作一个参数传给self
2.解决办法:
1)调用时主动传递实例本身给eat方法,即d.eat(d)
1 2 3 4 5 6 7 8 9 10 11 | |
2)在eat方法中去掉self参数(这也意味着,在eat中不能通过self.调用实例中的其它变量了)
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
类方法
类方法是将类本身作为对象进行操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法。
类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。
依然还是原来的代码,把eat变为类方法看下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
报错说明:People没有name属性;
上面说过,类方法只能访问类变量,不能访问实例变量,而name在这里就是实例变量。
我们加上一个类变量试试:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
属性方法
属性方法的作用就是通过@property把一个方法变成一个静态属性;
依然还是之前的代码,把eat方法变成静态属性看下效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
这里报错是因为eat已经变成了一个静态方法,当然不能再使用()去调用了,我们直接调用试试:
1 2 3 4 | |
反射
1.反射的定义
根据字符串的形式去某个对象中操作成员
- 根据字符串的形式去一个对象中寻找成员
- 根据字符串的形式去一个对象中设置成员
- 根据字符串的形式去一个对象中删除成员
- 根据字符串的形式去一个对象中判断成员是否存在
2. 反射的函数
- getattr(object, name[, default])
根据字符串的形式去一个对象中寻找成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
- setattr(object, name, value)
根据字符串的形式去一个对象中设置成员
1 2 3 4 5 6 7 8 9 10 11 12 | |
- delattr(object, name)
根据字符串的形式去一个对象中删除成员
1 2 3 4 5 6 7 8 9 10 11 12 | |
- hasattr(object, name)
根据字符串的形式去一个对象中判断成员是否存在
1 2 3 4 5 6 7 8 9 10 11 12 | |
异常处理
在之前学习的过程中我们会接触到各式各样的报错信息,编程过程中为了增加友好性,可以抓取相对应的错误并给出提示信息。
常用异常:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
更多异常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | |
常用异常实例:
IndexError(输出指定错误信息并打印错误信息)
1 2 3 4 5 6 7 8 9 | |
KeyError(输出指定错误信息并打印错误信息)
1 2 3 4 5 6 7 8 9 10 | |
ValueError
1 2 3 4 5 6 7 8 9 | |
万能异常Exception:(不建议用,不便于调试;可与异常配合使用)
1 2 3 4 5 6 7 8 9 | |
自定义异常:
1 2 3 4 5 6 7 8 9 | |
转载于:https://www.cnblogs.com/liuyuchen123456/p/5855894.html