标签:python python-3-x multiple-inheritance
我有这个代码,显示了经典的钻石图案:
class A:
def __init__( self, x ):
print( "A:" + x )
class B( A ):
def __init__( self, x ):
print( "B:" + x )
super().__init__( "b" )
class C( A ):
def __init__( self, x ):
print( "C:" + x )
super().__init__( "c" )
class D( B, C ):
def __init__( self ):
super().__init__( "d" )
d = D()
输出是:
B:d
C:b
A:c
> B:d有意义,因为D来自B.
> A:c我几乎得到了,虽然我同样可以看到A:b.
>但是,C:b位没有意义:C不是从B派生的.
有人能解释一下吗
不幸的是,像this这样的问题没有提到参数.
解决方法:
Python中的类是动态组合的 – 包括继承.
C:b输出并不意味着B神奇地从C继承.如果你实例化B或C,则没有人知道另一个.
>>> B('root')
B:root
A:b
但是,D确实知道B和C:
class D(B,C):
...
这有很多technicalities可用.但是,这基本上有两个部分:
> Direct Base Classes按其出现的顺序进行解析.
> B来自C.
>递归基类被解析为不重复.
> B和C的基类必须遵循两者.
对于D类,这意味着基类解析为B-> C-> A! C潜入B和A之间 – 但仅限于D级,而不是B级.
请注意,实际上涉及另一个类:默认情况下,所有类都派生自对象.
>>> D.__mro__
(__main__.D, __main__.B, __main__.C, __main__.A, object)
你已经写过A知道没有基础来获取它的参数.但是,B和C都不能假设这一点.他们都期望从A对象派生.但是,子类确实意味着B和C都是有效的A对象!
它对于B和C都在B和C之前是有效的,因为这两个是A的子类.B-> C-> A->对象不破坏B期望其超类为A类.
对于所有其他组合,最终会出现C无效(无效)或对象(无效)之前的对象.这排除了深度优先分辨率B-> A->对象 – > C和重复B-> A->对象 – > C-> A->对象.
此方法解析顺序可用于启用mixins:依赖其他类来定义方法解析方式的类.
有一个nice example的字典访问记录器可以接受dict和OrderedDict.
# basic Logger working on ``dict``
class LoggingDict(dict):
def __setitem__(self, key, value):
logging.info('Settingto %r' % (key, value))
super().__setitem__(key, value)
# mixin of different ``dict`` subclass
class LoggingOD(LoggingDict, collections.OrderedDict):
pass
标签:python,python-3-x,multiple-inheritance 来源: https://codeday.me/bug/20191002/1841193.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。