27. 属性的__dict__系统

1)对象的属性可能来自:

  • 其类的定义,叫做类属性
  • 继承父类的定义
  • 该对象实例定义(初始化对象时赋值),叫做对象属性

2)对象的属性存储在对象的 __dict__ 属性中:

  • __dict__ 为字典,键为属性名,值是属性本身。

例子:

class bird(object):
feather = True # 父类 class chicken(bird):
fly = False
def __init__(self, age):
self.age = age # 子类 summer = chicken(2) # 子类的对象 print(bird.__dict__) # 父类属性
{'__dict__': <attribute '__dict__' of 'bird' objects>,   '__module__': '__main__',   '__weakref__': <attribute '__weakref__' of 'bird' objects>,   'feather': True, '__doc__': None}
print(chicken.__dict__)    # 子类属性
{'fly': False, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x2b91db476d70>}
print(summer.__dict__)     #对象属性
{'age': 2}

3)属性是分层定义的:

比如上面分为 object / bird / chicken / summer这四层。

当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到最近那个属性。

__class__ 和 __base__

__class__属性可以帮对象查询它的类;

__base__属性可以帮子类查询它的父类

4)修改/引用对象的属性

下面两重方式互相等价:

summer.__dict__['age'] = 3       print(summer.__dict__['age'])
summer.age = 3                   print(summer.age)

28. 特性 property

__dict__ 是以静态方式存储属性。而有时,我们希望即时生成属性,比如a〉5时,b为true;a<=5时,b就是false,b是依赖a的。

特性是一种办法,通过内置函数property() 来创建。最多有四个参数:

  • 函数1,用于处理查询特性
  • 函数2,修改特性
  • 函数3,删除特性
  • 最后一个参数为特性的文档,可以为一个字符串,起说明作用

例子:

class num(object):
def __init__(self, value):
self.value = value
def getNeg(self):
return -self.value ## 参数1
def setNeg(self, value):
self.value = -value ## 参数2
def delNeg(self):
print("value also deleted")
del self.value ## 参数3
neg = property(getNeg, setNeg, delNeg, "I'm negative")## 特性

x=num(-1.1)

print( x.neg)     # neg 是x的值的相反数

print( x.value)

还可以修改neg值: x.neg= 22,

此时                    print (x.value)  #x.value 也发生改变,为-22

29.  特殊方法 __getattr__ 也可以即时生成属性

__getattr__ 是一个特殊方法,可以查询一个即时属性。如果不存在,可以创建之。

class bird(object):
feather = True class chicken(bird):
fly = False
def __init__(self, age,part):
self.age = age
self.part = part
def __getattr__(self, name): # 查询 adult 这个即时属性,如果不存在,重建
if name == 'adult':
if self.age > 1.0: return True
else: return False
        elif name == 'male':               # 查询 male 这个即时属性,如果不存在,重建
if self.part=10: return True
else: return False
        else: raise AttributeError(name)   # 查询adult,male之外的属性,报错!
summer = chicken(2,5)  # 此时 print(summer.adult), 为True
summer.part = 0.5     # 此时 print(summer.male),为False
print(summer.your) # your, 抛出异常!

注: 还有一些其它的方式可以即时生成属性,慢慢积累学习吧。

最新文章

  1. Spark的持久化简记
  2. Java中用内存映射处理大文件
  3. 新建myeclipse工作空间需要的工作
  4. -_-#【Markdown】
  5. Object-C 对象 (创建/销毁 对象)-- 笔记
  6. Cocos2d-x--Box2D绘制出两个矩形框的解决方案
  7. 使用python将多个excel合并
  8. 开源项目AndroidReview学习小结(2)
  9. Vue小项目二手书商城:(三)前端渲染数据
  10. linux top指令信息表示
  11. .NET Core 跨平台发布Linux和OSX
  12. JSLinux
  13. linux环境如何配置repo
  14. [您有新的未分配科技点][BZOJ3545&amp;BZOJ3551]克鲁斯卡尔重构树
  15. thymeleaf 字符串的拼接
  16. Opengl绘制我们的小屋(一)球体,立方体绘制
  17. SpagoBI 教程 Lesson 5: Creating a dashboard with BIRT and SpagoBI
  18. 试玩mpvue,用vue的开发模式开发微信小程序
  19. phpcms URL
  20. Enum枚举类使用集合

热门文章

  1. (原创)mybatis学习二,spring和mybatis的融合
  2. codevs 1907 方格取数 3
  3. Cordova - 使用Cordova开发iOS应用实战5(获取手机里照片,并编辑)
  4. [转]使用URLDecoder和URLEncoder对中文进行处理
  5. Framework/base 下添加自定义模块的步骤
  6. codevs3143 二叉树的序遍历
  7. VMware Fusion 中如何复制centos/linux虚拟机
  8. 细细品味Storm_Storm简介及安装
  9. ios蓝牙开发(五)BabyBluetooth蓝牙库介绍
  10. SQL 性能调优日常积累