Python类的__dict__方法

本文深入探讨了Python中对象属性的概念,包括类属性与实例属性的区别,如何使用__dict__访问属性,以及方法与实例之间的绑定关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案。dict是用来存储对象属性的一个字典,其键为属性名,值为属性的值

>>> class A:
    pass
dir函数可以查看类的属性和方法 从中可以查看__dict__
>>> dir(A)

['__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__']

class Spring(object):
    #season 为类的属性
    season = "the spring of class"

>>> Spring.__dict__
mappingproxy({'__module__': '__main__', 'season': 'the spring of class', '__dict__': <attribute '__dict__' of 'Spring' objects>, '__weakref__': <attribute '__weakref__' of 'Spring' objects>, '__doc__': None})

>>> Spring.__dict__['season']
'the spring of class'
>>> Spring.season
'the spring of class'

Spring.__dict__['season']就是访问类属性,同时通过.号也可以访问该类属性

# 类实例化
s = Spring()
>>>s.__dict__
{}
实例属性的__dict__是空的,**因为season是属于类属性**
>>> s.season
'the spring of class'
**s.season是指向了类属性中Spring.season**
#建立实例对象
>>> s.season = 'the spring of instance'
>>> s.__dict__
{'season': 'the spring of instance'}

这样实例属性里面就不空了,这时候建立的s.season属性与上面s.season(类属性)重名,并且把原来的“遮盖了”。

#查看类属性
>>> Spring.season
'the spring of class'
>>> Spring.__dict__['season']
'the spring of class'

**由上我们看到Spring类season属性并没有受到实例影响,其原因是实例s对象建立时 
s.season未初始化则会自动指向类属性,如果实例属性被修改那么就不指向类属性,同
时类属性也不会受到影响**
#定义其它实例属性
>>> s = Spring()
>>> s.lang = 'python'
>>> Spring.lang
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    Spring.lang
AttributeError: type object 'Spring' has no attribute 'lang'
上明错误表面 实例对象添加内容,不是类属性 

#定义一个类
>>> class Spring:
    def tree(self,x):
        self.x = x
        print(self.x)

>>> Spring.__dict__['tree']
<function Spring.tree at 0x036E4AE0>
在类属性是存在tree方法

>>> s.__dict__['tree']
Traceback (most recent call last):
  File "<pyshell#33>", line 1, in <module>
    s.__dict__['tree']
KeyError: 'tree'
但是实例对象s__dict__ 方法里不存在tree方法
>>> s.tree('123')
123
但是s能调用tree方法,其原因是s.tree指向了Spring.tree方法
实例s与self新建了对应关系,两者是一个外一个内,在方法中self.x = x 
将x值赋给了self.x,也就是实例应该拥有这么一个属性。self相当于java中this指针
>>> s.__dict__
{'x': '123'}
即实例方法(s.tree('123'))的第一个参数(self,但没有写出来)绑定实例S,透过
self.x来设定值,给s.__dict__添加属性值

换一个角来看
class Spring:
    def tree(self,x):
        print(x)

这个方法没有self.x = x 直接输出x
>>> s = Spring()
>>> s.tree('123')
123
>>> s.__dict__
{}
更加说明self与实例s的关系,这个结果更加说明 Python一个观点,一切都是对象,无论
是类还是实例的属性和方法都是符合object.attribute格式,并且属性类似。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值