Python 函数相关(二)
1. 多态
同一个方法在不同的类中最终呈现出不同的效果,即为多态。
| |
2. 继承 重构 重写 重载
Python的继承没有类似java中的extends关键字,当Python中一个类需要继承另一个类的时候,只需要将被继承的类通过变量形式传递给新类,即可完成继承Python还可以实现多继承,将多个被继承类通过变量形式传递给新类,即可完成多继承
2.1. 重写
方法名相同,参数相同,内容不同
2.2. 重载
方法名字相同,参数不同
3. 继承查询
Python2 经典类都是按照深度类查询(及深度优先搜索算法)Python2 新式类都是按照广度类查询(及广度优先搜索算法)Python3 新式类和经典类都是按照广度类查询
4. 示例:
只能说是可以用,但还是有很大部分的疑问,只能用仅剩的一点java记忆强行解释了
| |
5. 类方法、静态方法、属性方法、property
静态方法: 通过修饰器
@staticmethod来进行修饰的方法,静态方法不需要定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用(实际上不可直接访问类和实例中的任何属性和方法)。可通过实例对象或类对象进行访问。类方法: 是类对象所拥有的方法,需要用修饰器
@classmethod来标识其为类方法,第一个参数必须是类对象,一般以cls作为第一个参数。可通过实例对象或类对象进行访问。类方法只能访问类变量,不可访问实例(self)变量。属性方法: 通过
@property来进行修饰,可以将类方法转换为属性对象,使其调用时候可以直接通过实例对象像调用类属性一样进行调用,其总共包含三种访问形式@property,@方法名.setter,@方法名.deleter。一般用来处理私有变量。和java的getter、setter方法有点类似(吧?个人感觉没什么卵用的样子,可能是没有用到)property: 大部分的解释是函数的作用是在新式类中返回属性值,个人还并不是特别理解这个的意思,不过用java来对比的话,就是getter、setter的升级版。property总共包含4个参数:- 第一个参数是方法名,在调用
(类/实例)对象.属性自动触发执行方法; - 第二个参数是方法名,在调用
(类/实例)对象.属性=xx时自动触发执行方法; - 第三个参数是方法名,在调用
del (类/实例)对象.属性时自动触发执行方法; - 第四个参数是字符串,在调用
实例对象.属性.__doc__,此参数是该属性的描述信息;
- 第一个参数是方法名,在调用
示例:
| |
6. metaclass
这个东西个人感觉又有点像注入的感觉吧,他的作用是在某个类中定义当前类按照什么方式来被初始化(或者创建),大概就是这个意思吧
7. 反射
通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法
getattr(object, str, default=None)得到对象中字符串表示的方法的内存地址hasattr(object, str):判断一个对象中是否包含字符串表示的方法setattr(object, str, func):为类添加一个新的函数(或变量)object.str = funcdelattr(class_object,str):删除类中表示字符串的变量(或函数),等价于del class_object.str
示例代码:
| |
8. 异常处理
常见异常
| 异常名称 | 描述 |
|---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
示例 1 :
| |
示例 2 :
| |
9. 断言 assert
语法格式:assert condition,str 用来判断条件真假,为真执行下一步,为假抛出AssertionError 异常
其功能大致相当于 :
| |
示例 :
| |