python 子类关系

    技术2022-07-10  101

    说明

    python为所有类提供一个__bases__属性,通过该属性可以查看该类的所有直接父类,该属性返回所有直接父类组成的元组python为所有类提供了一个__subclasses__()方法,通过该方法可以查看该类的所有直接子类,该方法返回该类的所有子类组成的列表子类继承父类的私有方法重写无效,公有方法可以重写,引用父类方法可用super()实现

    来个特别的例子

    from collections import Hashable print(issubclass(list, object)) # True print(issubclass(object, Hashable)) # True print(issubclass(list, Hashable)) # False

    list 是object的子类, object是Hashable的子类, 子类关系应该是可以传递的, 为什么list不是Hashable的子类?

    Python 中的子类关系并不一定是传递的. 任何人都可以在元类中随意定义 __subclasscheck__

    a. 元类可以简称为类的类 b. type是Python的一个内建元类,用来直接控制生成类 c. 在python当中任何class定义的类其实都是type类实例化的结果 d. 只有继承了type类才能称之为一个元类,否则就是一个普通的自定义类, 自定义元类可以控制类的产生过程,类的产生过程其实就是元类的调用过程 class A(type): def __subclasscheck__(self, subclass): print('invoke __subclasscheck__') return True def __hash__(self): print('__hash__') class B(metaclass=A): pass print(issubclass(list, B)) >invoke __subclasscheck__ >True

    当issubclass(cls, Hashable) 被调用时, 它只是在 cls 中寻找__hash__方法或者从继承的父类中寻找__hash__方法

    由于 object 是可散列的(hashable), 但是list是不可散列的, 所以它打破了这种传递关系

    Processed: 0.014, SQL: 9