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. java多线程系类:基础篇:05线程的等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  2. mysql新建用户的方法

    新增 insert into mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) values("local ...

  3. servlet 中文乱码问题

    两步骤搞定: 1,修改tomcat的server.xml <Connector port="8080" protocol="HTTP/1.1" conne ...

  4. NET WebApi OWIN 实现 OAuth 2.0

    NET WebApi OWIN 实现 OAuth 2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和 ...

  5. codevs2806 红与黑

    难度等级:白银 codevs2806 红与黑 题目描述 Description 有一个矩形房间,覆盖正方形瓷砖.每块瓷砖涂成了红色或黑色.一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一, ...

  6. Ros学习注意点

    编译问题 回调函数不能有返回类型,严格按照实例程序编写 第三方库的问题,packet.xml里面必须加上自己的依赖文件 之前文档里面介绍的有点问题. 主要表现在:当你建立包的时候就写入了依赖,那就不需 ...

  7. web 前端常用组件【01】Pagination 分页

    分页组件几乎是一般网站都会涉及到的组件,网上有很多这样的插件,自己挑来跳去选择了这一款. 官方Demo网址:http://mricle.com/JqueryPagination 功能强大,可扩展性比较 ...

  8. <实训|第十一天>学习一下linux中的进程,文件查找,文件压缩与IO重定向

    [root@localhost~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就 ...

  9. PHP 依赖注入,从此不再考虑加载顺序

    说这个话题之前先讲一个比较高端的思想--'依赖倒置原则' "依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下层代码,当下层代码有所改动时,上层代码也要相应进行改动,因此维护成本较高 ...

  10. [BZOJ1579][Usaco2009 Feb]Revamping Trails 道路升级(二维最短路问题)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1579 分析: 设d[i][j]表示从1走到i.改了j条边的最短路径长度 如果设i相连的 ...