python查看类的继承层次结构以及object根类

通过类的方法mro()或者类的属性__mro__可以输出这个类的继承层次结构

class a():
    pass

class b(a):
    pass

class c(b):
    pass

if __name__ == '__main__':
    print(c.mro())

执行反回:

[<class '__main__.c'>, <class '__main__.b'>, <class '__main__.a'>, <class 'object'>]

  继承顺序   c  ->  b  ->  a  -> object根类

*python支持多继承,如果父类有相同名字的方法,在子类没有指定父类名时,解释器将“从左向右”按顺序搜索。

MRO(Methond Resolution Order):方法解析顺序。可以通过mro()方法获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找的。

【操作】查看类的多重继承层次结构

# 测试mro()方法解析顺序
class a():
    def kk(self):
        print('aa')

    def hh(self):
        print('我是a')

class b():
    def bb(self):
        print('bb')

    def hh(self):
        print('我是b')

class c(b,a):
    def cc(self):
        print('cc')

cc=c()
print(c.mro())  #打印类的层次结构
cc.hh()         #解释器寻找方法是“从左到右”的方式寻找,此时会执行b类的hh()

执行返回:

[<class '__main__.c'>, <class '__main__.b'>, <class '__main__.a'>, <class 'object'>]
我是b

object根类

object类是所有类的父类,因此所有的类都有object类的属性和方法,有必要深入研究一下object类的结构,对于继续深入学习python很有好处。

dir()查看对象属性

为了深入学习对象,先学习内置函数dir(),可以让我们方便看到指定对象所有的属性

【测试】查看对象所有属性以及和object进行比对

class P:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_age(self):
        print(f'我是:{self.name},年龄:{self.age}')


if __name__ == '__main__':
    p=P('张三',18)
    obj=object()
    print('打印object根类的属性:',dir(obj))
    print('---'*50)
    print('打印类p的属性:',dir(p))

执行结果:

打印object根类的属性: ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
打印类p的属性:            ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'say_age']

从上面可以发现这样 几个要点:

1.p对象增加类六个属性:

             __dict__    __module__   __weakref__    age  name   say_age

2.object的所有属性,p类作为object的子类,显然包含类所有属性

3.打印age,name,say_age,发现say_age虽然是方法,实际上也是属性,只不过,这个属性的类型是“method”。

   age <class 'int'>

   name <class 'str'>

   say_age  <class 'method'>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值