吴忠市建设工程质量监督站网站,网页版微信登录提示二维码已失效,a站为什么会凉,网络营销与策划接上文#xff0c;再介绍最后几个常用的魔法方法。 关于__dict__: 先上个例子#xff1a; class Test(object):fly Truedef __init__(self, age):self.age age __dict__魔法方法可以被称为系统#xff0c;他是存储各分层属性的魔法方法。__dict__中#xff0c;键为属性名…接上文再介绍最后几个常用的魔法方法。 关于__dict__: 先上个例子 class Test(object):fly Truedef __init__(self, age):self.age age __dict__魔法方法可以被称为系统他是存储各分层属性的魔法方法。__dict__中键为属性名值为属性本身。可以这样理解在平时我们给类和实例定义的那些属性都会被存储到__dict__方法中用于读取。而我们平时使用的类似这样的语法Test.fly 其实就是调用了类属性同样可以写成Test.__dict__[fly]。除了类属性还有实例属性。当我们用类实例化一个实例例如上文我们使用p Test(2)实例化类Test,p也会具有__dict__属性。这里会输出 {age: 2} 由上可以发现python中的属性是进行分层定义的。/object/Test/p这样一层一层下来的。当我们需要调用某个属性的时候python会一层一层往上面遍历上去。先从实例然后实例的__class__的__dict__,然后是该类的__base__。这样__dict__一路找上去。如果最后都没有找到就抛出AttributeError错误。 这里可以延伸一下没记错的话我前面有篇文章讲了一个方法__slot__。__slots__方法就是通过限制__dict__只让类实例初始化__slots__里面定义的属性而且让实例不再拥有__dict__方法来达到节约内存的目的。我将会就上面的那个例子重写一下来说明这个问题。 class Test(object):__slots__ [age]fly Truedef __init__(self, age):self.age age output In [25]: Test.__dict__
Out[25]:
dict_proxy({__doc__: None,__init__: function __main__.__init__,__module__: __main__,__slots__: [age],age: member age of Test objects,fly: True})In [36]: p.__dict__
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
ipython-input-36-3a1cec47d020 in module()
---- 1 p.__dict__AttributeError: Test object has no attribute __dict__In [37]: p.age
Out[37]: 3In [38]: p.fly
Out[38]: True 可以看到__slots__方法并没有阻止由下至上的属性查找方法只是不会再允许没有包含在__slots__数组中的属性再被赋值给实例了。但这并不妨碍继续调用允许访问的属性以及类属性。 关于__get__, __set__, __del__: 在前面的文章里面我也介绍过这三个魔法方法虽然一般是用不到的但是在写库的时候它们有特别的用途。他们是python另外一个协议descriptor的根基。 同一个对象的不同属性之间可能存在依赖关系。当某个属性被修改时我们希望依赖于该属性的其他属性也同时变化。在这种环境下面__dict__方法就无法办到。因为__dict__方法只能用来存储静态属性。python提供了多种即时生成属性的方法。其中一种就是property。property是特殊的属性。比如我们为上面的例子增加一个property特性使得他能够动态变化。来看这个例子 class Test(object):fly Truedef __init__(self, age):self.age agedef whether_fly(self):if self.age 30:return Trueelse:return Falsedef just_try_try(self, other):passwhether_fly property(whether_fly)p Test(20)
print p.age
print p.whether_fly
p.age 40
print p.age
print p.whether_fly output: 20
True
40
False 可以看到 我们可以使用这种手段动态修改属性值。property有四个参数。前三个参数为函数分别用于处理查询特性、修改特性、删除特性。最后一个参数为特性的文档可以为一个字符串起说明作用。这里我只是要到了第一个参数查询的时候动态修改他的返回值而第二个参数是在修改值的时候就会体现出来。 Reference: http://www.cnblogs.com/vamei/archive/2012/12/11/2772448.html 转载于:https://www.cnblogs.com/piperck/p/6362203.html