python 子类关系

说明
  1. python为所有类提供一个__bases__属性,通过该属性可以查看该类的所有直接父类,该属性返回所有直接父类组成的元组
  2. python为所有类提供了一个__subclasses__()方法,通过该方法可以查看该类的所有直接子类,该方法返回该类的所有子类组成的列表
  3. 子类继承父类的私有方法重写无效,公有方法可以重写,引用父类方法可用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的子类?

  1. 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
    
  2. issubclass(cls, Hashable) 被调用时, 它只是在 cls 中寻找__hash__方法或者从继承的父类中寻找__hash__方法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值