实验记录-python1
来源:互联网 发布:a*算法 编辑:程序博客网 时间:2024/03/29 21:18
目标:
理解通过内置函数property() 及 __getattr__
创建属性的过程。
实验过程
Python 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> class bird(object):... feather = True... >>> class chicken(bird):... def __init__(self,age):... self.age = age... def getAdult(self):... if self.age>10: return True... else: return False... fly = False... adult = property(getAdult)... >>> summer = chicken(2)>>> >>> print summer.__dict__{'age': 2}>>> print summer.adultFalse>>> print summer.age2>>> print summer.flyFalse>>> print summer.featherTrue>>> >>> print summer.__class__ # 追溯对象的类<class '__main__.chicken'>>>> print chicken.__base__ # 追溯类的父类<class '__main__.bird'>>>> print bird.__base__ # 追溯父类的父类<type 'object'>>>> print object.__base__None>>> >>> class num(object):... def __init__(self, value):... self.value = value... def getNeg(self):... return -self.value... def setNeg(self, value):... self.value = -value... def delNeg(self):... print "value deleted"... del self.value... neg = property(getNeg, setNeg, delNeg, "I am negative")... >>> x = num(1.1)>>> print x.neg-1.1>>> x.neg = -22>>> print x.value22>>> print num.neg.__doc__I am negative>>> del x.negvalue deleted>>> print x.valueTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'num' object has no attribute 'value'>>> x.negTraceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in getNegAttributeError: 'num' object has no attribute 'value'>>> print x.negTraceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in getNegAttributeError: 'num' object has no attribute 'value'>>>
通过__getattr__(self, name)
可用来查询即时生成的属性。当通过__dict__
方法无法找到该属性,那么Python会调用对象的__getattr__
方法,来即时生成该属性。
>>> class bird(object):... feather = True... >>> class chicken(bird):... fly = False... def __init__(self, age):... self.age = age... def __getattr__(self, name):... if name == 'adult':... if self.age >1.0: return True... else: return False... else: raise AttributeError(name)... >>> summer = chicken(2)>>> >>> print summer.adultTrue>>> summer.age = 0.5>>> >>> print summer.adultFalse>>> print summer.maleTraceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 9, in __getattr__AttributeError: male>>>
结论
在class中通过 property函数定义类属性(设置getter, setter和del方法),之后,在对象中即可动态操作这些属性。这些属性(property)不同于类或对象的特性(attribute),后者静态保存于对象的__dict__
中。
通过__getattr__
可以将所有的即时生成属性放在同一个函数中处理。
0 0
- 实验记录-python1
- Python1
- python1
- Python1
- Python1
- python1
- Python1
- python1
- python1
- Python1
- python1
- Python1
- python1
- python1
- 初学python1
- python1作业
- python1-3.25
- python1~5
- 天猫优惠券怎么使用,天猫购物券怎么用
- robomongo看数据库的collection是空,但是明明collection是有的
- 电脑很卡的原因之一。
- Android 7.0 IMS框架详解
- 大括号匹配和字体修改
- 实验记录-python1
- 将一条一条的json转成树形结构
- 1045. Favorite Color Stripe (30),需要抽象问题
- 玩转 Nginx 日志
- C语言实现栈(基于数组)
- P2
- 归档/ 解档
- Android Onclick
- Elasticsearch 2.2.0 集群配置详解