首先要聊的是继承内置类型:
从文档中可以得知:
Officially, CPython has no rule at all for when exactly overridden method of subclasses of built-in types get implicitly called or not. As an approximation, these methods are never called by other built-in methods of the same object. For example, an overridden __getitem__() in a subclass of dict will not be called by e.g. the built-in get() method.
举个例子:
class D(dict):
def __getitem__(self, key):
return 'from D'
有这么一个方法,改写了value的取值
a= D(test = '45')
a
Out[12]: {'test': 'from D'}
实例化D,是我们的结果,并且看到
a['23']
Out[13]: 'from D'
我们输入任何一个数,也输出了相应的value
b = {}
b.update(a)
b
Out[17]: {'test': '45'}
但是再将d设为字典,把a的值更新进d里,你会发现,value值变了,因为python的内置方法会忽略用户覆盖的方法。
如果需要继承,需要使用collecions模块。
多重继承和方法解析顺序:
多重继承的一个问题是,不相关的祖先类实现了同名方法,这种冲突叫做“菱形问题”
例如:
class A():
def ping(self):
print('A', self)
class B(A):
def pong(self):
print('B',self)
class C(A):
def pong(self):
print('C', self)
有如上三个类,ABC,其中B,C拥有同一个方法。
现在:
class D(B, C):
def ping(self):
super().ping()
print('ping', self)
a = D()
a.ping()
A <__main__.D object at 0x00000264F2AEABE0>
ping <__main__.D object at 0x00000264F2AEABE0>
实例化D,我们注意到了super()函数,可以把这个方法调用委托给超类。这个是符合方法解析顺序的调用,如果我们希望调用某个确定的类,我们可以使用
class D(B, C):
def ping(self):
A.ping(self)
print('ping', self)
这时候你就有必要写上self,因为这样访问的是未绑定的方法。
前面提到了方法解析顺序,我们可以使用__mro__来看看:
class D(B, C):
def pong(self):
super().pong()
B.pong(self)
C.pong(self)
print('D',self)
来看看结果:
B <__main__.D object at 0x00000264F2AEA518>
B <__main__.D object at 0x00000264F2AEA518>
C <__main__.D object at 0x00000264F2AEA518>
D <__main__.D object at 0x00000264F2AEA518>
D.__mro__
Out[23]: (__main__.D, __main__.B, __main__.C, __main__.A, object)
这就是python的方法解析顺序,这个考虑的是继承图,而且也与B,C的顺序有关。
重载运算符:
这个含义是什么呢?简而言之就是对中缀运算符(+,-等)和一元运算符(~之类的),进行重新定义,使得用户定义的对象也可以使用。
不过python也有限制的,例如:
--不能重载内置类型的运算符
--不能新建运算符,只能使用现有的
--is,not,or和and不能重载
重载运算符很简单只要实现相应的方法即可,例如:
class test():
def __eq__(self, item):
return item
一个简单不应该这么使用的例子:
a = test()
a == '3'
Out[26]: '3'
这样我们就发现==输出的就是3了
有个规则需要注意:始终要返回一个新对象,不能修改self,要创建并返回合适类型的新实例。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有