类的设计模式
# 类的设计模式
1.Python 不会执行同名函数的重载,而只会用新对象覆盖旧对象
class A:
def func(self,x):
pass
def func(self,x,y):
pass
2
3
4
5
由于class
、def
均为可执行代码,因此func
变量名这里被重新赋值了。
2.委托设计:在 Python 中委托通常以拦截.__getattr__(self,'name')
来实现。该方法会拦截对不存在属性的读取
代理类实例对象可以利用
.__getattr__(self,'name')
将任意的属性读取转发给被包装的对象代理类可以有被包装对象的借口,且自己还可以有其他接口
3.Python 支持变量名压缩的概念:
class
语句内以__
(两个下划线)开头但是结尾没有__
(两个下划线)的变量名(如__x
)会自动扩张为包含所在类的名称(如_classname__x
)变量名压缩只发生在
class
语句内,且仅仅针对__x
这种以__
开头的变量名该做法常用于避免实例中潜在的变量名冲突
4.Python3 中,实例方法有两种形式:
普通函数方法:通过对类名进行点号运算而获得类的函数属性,如
classname.func
,会返回普通函数方法。- 若调用的是实例方法,必须明确提供实例对象作为第一个参数,如
classname.func(obj,arg)
- 若调用的是一般的方法,则遵守普通函数调用规则即可
classname.func(arg)
- 若调用的是实例方法,必须明确提供实例对象作为第一个参数,如
绑定方法:通过对实例对象进行点号运算而获得类的函数属性,如
obj.func
,会返回绑定方法对象。Python 在绑定方法对象中,自动将实例和函数打包 _ 绑定方法调用时,不需要手动传入实例对象,如obj.func(arg)
_ 绑定方法的__self__
属性引用被绑定的实例对象,__func__
属性引用该类的该函数对象5.多重继承:子类可以继承一个以上的超类。超类在
class
语句首行括号内列出,以逗号分隔子类与其实例继承了列出的所有超类的命名空间
搜索属性时,Python 会从左到右搜索
class
首行中的超类,直到找到匹配的名字6.工厂函数:通过传入类对象和初始化参数来产生新的实例对象:
def factory(classname,*args,**kwargs):
return classname(*args,**kwargs)
2
7.抽象超类:类的部分行为未定义,必须由其子类提供
- 若子类也未定义预期的方法,则 Python 会引发未定义变量名的异常
- 类的编写者也可以用
assert
语句或者raise
异常来显式提示这是一个抽象类
class A:
def func(self):
self.act() #该方法未实现
def act(self):
assert False, 'act must be defined!'
class ChildA(A):
def act(self):
print('in ChildA act')
x=child()
x.func()
2
3
4
5
6
7
8
9
10
这里的核心在于:超类中self.act()
调用时,self
指向的有可能是真实的实例对象(子类对象)