Python类的__dict__方法

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__': '__dict__' of 'Spring' objects>, '__weakref__': '__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 "", line 1, in 
    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']
0x036E4AE0>
在类属性是存在tree方法

>>> s.__dict__['tree']
Traceback (most recent call last):
  File "", line 1, in 
    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格式,并且属性类似。

你可能感兴趣的:(Python基础)