python之类里面的__dict__属性详解(python中dict函数的用法)

网友投稿 607 2022-08-28


python之类里面的__dict__属性详解(python中dict函数的用法)

前言

python是面向对象的,对象有属性和方法,可以通过__dict__查看对象的属性。

我们都知道Python一切皆对象,那么Python究竟是怎么管理对象的呢?

__dict__查看对象属性

首先弄清楚2个概念,类(A)和类的实例对象(A()), 如下代码:

count 是A的类属性name和age是 A类的实例对象A()属性start 是实例方法,默认带self参数stop 是静态方法,可以不带默认参数open 是类方法,默认带cls参数

class A(object): count = 0 def __init__(self): self.name = "yoyo" self.age = 18 def start(self): """实例方法""" print("start-11111") @staticmethod def stop(): """静态方法""" print("stop-22222") @classmethod def open(cls): print("open-3333333")

A类有属性和方法,抽象的来讲,方法也可以看成类的属性(方法属性)

print(A.__dict__) # A类属性a = A() # a是A类的实例对象print(a.__dict__) # A类的实例对象属性

运行结果:

{'__module__': '__main__', 'count': 0, '__init__': , 'start': , 'stop': , 'open': , '__dict__': , '__weakref__': , '__doc__': None}{'name': 'yoyo', 'age': 18}

从运行结果可以看出,A的类属性有count,还有定义的一些方法(__init__构造方法,还有实例方法,静态方法,类方法)。

A()实例对象只有__init__构造方法里面的name和age属性(count是类属性,并不是类的实例对象属性)。

如果我们直接A.name 和 A.age就会报错:

print(A.name)print(A.age)

报错

Traceback (most recent call last): File "D:/wangyiyun_hrun3/demo/a.py", line 27, in print(A.name)AttributeError: type object 'A' has no attribute 'name'

因为name和age属性在__init__构造方法里面,只有当A类实例化的时候,才会执行__init__构造方法,这时候才会有name和age属性了。

继承时__dict__属性

当B类继承A类的时候,A类和B类都有自己的类属性 count,也各自有自己的__init__构造方法:

class A(object): count = 0 def __init__(self): self.name = "yoyo" self.age = 18 def start(self): """实例方法""" print("start-11111") @staticmethod def stop(): """静态方法""" print("stop-22222") @classmethod def open(cls): print("open-3333333")class B(A): count = 22 def __init__(self): super().__init__() self.name = "hello" self.age = 22 def new(self): print("new--44444")print(A.__dict__)print(B.__dict__)a = A()b = B()print(a.__dict__)print(b.__dict__)

运行结果:

{'__module__': '__main__', 'count': 0, '__init__': , 'start': , 'stop': , 'open': , '__dict__': , '__weakref__': , '__doc__': None}{'__module__': '__main__', 'count': 22, '__init__': , 'new': , '__doc__': None}{'name': 'yoyo', 'age': 18}{'name': 'hello', 'age': 22}

从运行结果可以看出

A类和B类的类属性count是不一样的,虽然B类继承了A类,方法属性也不一样,可以清楚的区分出哪些是A类的方法属性,哪些是B类的方法属性

并不是所有的对象都存在__dict__属性

虽然说一切皆对象,但对象也有不同,一些内置的数据类型是没有__dict__属性的,如下:

num = 3ll = []dd = {}print num.__dict__print ll.__dict__print dd.__dict__

运行结果:

Traceback (most recent call last): File "f:\python\test.py", line 54, in print num.__dict__AttributeError: 'int' object has no attribute '__dict__'Traceback (most recent call last): File "f:\python\test.py", line 55, in print ll.__dict__AttributeError: 'list' object has no attribute '__dict__'Traceback (most recent call last): File "f:\python\test.py", line 56, in print dd.__dict__AttributeError: 'dict' object has no attribute '__dict__'

去期待陌生,去拥抱惊喜。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python之类中静态方法(@staticmethod),类方法(@classmethod)和实例方法(self)的使用与区别
下一篇:python详解闭包(Python闭包)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~