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, 抛出异常!

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

python 学习笔记7(类/对象的属性;特性,__getattr__)的更多相关文章

  1. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  2. Python学习笔记之类与对象

    这篇文章介绍有关 Python 类中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中类的使用技巧 1.与类和对象相关的内置方法 issubclass(class, classinfo) ...

  3. Python学习笔记008_类_对象_继承_组合_类相关的BIF

    # 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...

  4. python学习笔记8--面向对象--属性和方法详解

    属性: 公有属性  (属于类,每个类一份) 普通属性  (属于对象,每个对象一份) 私有属性    (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法:(按作用) 构造方法 析构函数 方法: ...

  5. python学习笔记1-元类__metaclass__

    type 其实就是元类,type 是python 背后创建所有对象的元类   python 中的类的创建规则: 假设创建Foo 这个类 class Foo(Bar): def __init__(): ...

  6. python学习笔记4(对象/引用;多范式; 上下文管理器)

    ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是储存在内存中的实体,对象名只是指向这一对象的引用(refere ...

  7. python学习笔记(七) 类和pygame实现打飞机游戏

    python中类声明如下: class Student(object): def __init__(self, name, score): self.name = name self.score = ...

  8. Python学习笔记 - day7 - 类

    类 面向对象最重要的概念就是类(Class)和实例(Instance),比如球类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同.在Python中,定义类 ...

  9. Python 学习笔记13 类 - 创建和简单使用

    介绍: 面向对象编程是一种非常有效的软件编写方法之一,在面向对象编程中,我们会编写表示现实世界中的事物或者情景的类,并基于类来创建对象. 在编写类的的时候,这些类对象一般都有通用的行为或者属性.基于类 ...

  10. python学习笔记(八)、特殊方法、特性和迭代器

    1 新式类和旧式类 python类的工作方式在不断变化.较新的Python2版本有两种类,其中旧式类正快速退出舞台.新式类时Python2.2 引入的,提供了一些额外功能,如支持函数super 和 p ...

随机推荐

  1. css默认值汇总

    原文:http://www.cnblogs.com/xiangzi888/archive/2011/10/12/2209514.html HTML标签CSS属性默认值汇总 这个东西,在你需要还原默认值 ...

  2. Windows Phone App Studio 无码开发手机应用

    上周微软发布了一款基于Web的Windows Phone应用开发工具 "Windows Phone App Studio".它与大家熟知Visual Studio的最大不同之处是W ...

  3. 本地的html怎么直接通过路径就读取本地文件。

    我要做的事情是已知一个目录的相对路径,获得这个路径下面所有的txt文件,然后读到一个JS Script里面做下一步处理. 网上的例子都是使用input的,既然我是local的html文件,也知道路径了 ...

  4. Java 生成 UUID

    1.UUID 简介 UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Found ...

  5. WebApiTestClient自定义返回值说明

    WebApiTestClient是基于微软HelpPage一个客户端调试扩展工具,用来做接口调试比较方便.但是对返回值的自定义说明还是有缺陷的.有园友写过一篇文章,说可以通过对类进行注释,然后通过在I ...

  6. 理解JavaScript的作用域链

    上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...

  7. ArcGIS支持MongoDB数据源

    ArcGIS支持MongoDB数据源 自从NoSQL推出之后,MongoDB就作为比较杰出的代表受到广大用户的推崇,当然,与之而来的大数据的讨论也非常激烈,GIS数据源向来都是以海量来计算,所以,GI ...

  8. 如何快速从一个Storage Account拷贝到另一个账号

    当您有两个Storage Account的时候,怎样快速做到从一个账号拷贝到另一个账号呢.当拷贝的文件比较,例如100多G(VHD文件). http://code.msdn.microsoft.com ...

  9. Echarts的相关问题记录与应用

    一.相关问题记录: 1.对图表的div进行隐藏操作,使用hide()或display:none,重新展示时,会造成图表无法获取高度,导致图表的高宽不符合预期: 解决方法:最后调用一下resize()函 ...

  10. ContentProvider备份短信,以xml文件存储

    因为短信的内容已经通过ContentProvider暴露出来,所以我们可以直接用内容解析者获取短信内容. 想要获取短信内容,你需要知道的一些东西: 1.Uri uri = Uri.parse(&quo ...