特性 property 都是类属性(静态变量),但是特性管理的其实是实例属性的存取,
****** 回顾 -'类方法' classmethod 和 '静态方法' staticmethod 皆可以访问类的静态变量(类变量),但不能访问实例变量(即类方法中定义的变量)

示例1 - 实例属性'覆盖'同名类属性(attribute);但不会'覆盖'同名的类特性(property),
class C(object):
c = 'It is class\'s attribute' @property
def pc(self):
return 'It is property pc' if __name__ == "__main__":
print(C.pc)
tester = C()
print(tester.__class__) #Conclusion
print(vars(tester.__class__)) #Conclusion
print(vars(tester)) #
print(C.c) #
print(tester.c) #
tester.c = '' #
print(vars(tester)) #
print(tester.c) #
print(C.c) # print('=====================')
print(vars(tester))
print(C.pc) #
print(tester.pc) #
tester.pc = '' #
tester.__dict__['pc'] = '' #7 直接创建实例的同名属性 - pc, 通过 tester.__dict__ 属性
print(vars(tester))
print(C.pc)
print(tester.pc)
print(getattr(tester,'pc','notfound'))
print(tester.__dict__['pc']) Output,
# 实例属性'覆盖'同名类属性
<property object at 0x035B9840> <class '__main__.C'>
{'__module__': '__main__', 'c': "It is class's attribute", 'pc': <property object at 0x01DA9840>,
'__dict__': <attribute '__dict__' of 'C' objects>,
'__weakref__': <attribute '__weakref__' of 'C' objects>, '__doc__': None} #Conclusion {} #1 实例 tester 属性
It is class's attribute #2
It is class's attribute #2 tester.c 获取的是属性 C.c
{'c': ''} #3 创建同名实例属性 c
12345 #
It is class's attribute #3
# 同名实例属性不会'覆盖' 类特性 property
=====================
{'c': ''}
<property object at 0x035B9840> #4 类的 property object
It is property pc #5 实例读取 property pc tester.pc = '' #6 因为同名实例属性不会'覆盖' 类特性 property, 故 raise error 'AttributeError: can't set attribute'
AttributeError: can't set attribute #6, 即 实例中的 property pc 是 '只读' 属性. {'c': '', 'pc': ''} #
<property object at 0x035B9840>
It is property pc
It is property pc
22222 Conclusion,
tester.c 这样的表达式不是从 tester 实例开始寻找属性 c ,而是从 tester.__class__ 开始找,
仅当类中没有同名为 c 的特性时, Python 才会在 tester 实例 __dict__ 属性中寻找.
这条规则不仅适用于特性,还适用于一整类描述符——覆盖型描述符(overriding descriptor).
其实,特性 property 其实是覆盖描述符 overriding descriptor.

相关的特殊属性,

__class__
对象所属类的引用(即 obj.__class__ 与 type(obj) 的作用相同), __dict__
一个'字典'形式的映射,存储对象或类的可写属性.
有 __dict__ 属性的对象,任何时候都能随意设置新属性.
如果类有 __slots__ 属性,它的实例可能没有 __dict__ 属性.
参见下面对 __slots__ 属性的说明. __slots__
一个类中可能定义该这属性,作用是限制实例能有哪些属性.
__slots__ 属性的值是一个字符串组成的元组,指明允许有的属性(如('x', 'y')).
如果 __slots__ 中没有 '__dict__',那么该类的实例则没有 __dict__ 属性,
实例只允许有指定名称的属性。
__slots__ 属性的值虽然可以是一个列表,但是最好始终使用元组,
因为处理完类的定义体之后再修改 __slots__ 列表没有任何作用,所以使用可变的序列容易让人误解。 相关的内置函数,

dir([object])
列出对象的大多数属性(https://docs.python.org/3/library/functions.html#dir),
dir 函数的目的是交互式使用,因此没有提供完整的属性列表,只列出一组“重要的”属性名.
dir 函数能审查有或者没有 __dict__ 属性的对象.
dir 函数不会列出 __dict__ 属性本身,但会列出其中(__dict__ 中)元素的键.
dir 函数也不会列出以下几个特殊属性, __mro__, __bases__, __name__.
如果没有指定 object 参数, dir 函数会列出当前作用域中的名称. vars([object])
返回 object 对象的 __dict__ 属性; 如果实例所属的类定义了 __slots__ 属性,
实例没有 __dict__ 属性,那么 vars 函数不能处理那个实例(dir 函数能处理这样的实例).
如果没有指定参数,那么 vars() 函数的作用与 locals() 函数一样:返回表示本地作用域的字典. getattr(object, name[, default])
从 object 对象中获取 name 字符串对应的属性,获取的属性可能来自对象所属的类或超类.
如果没有指定的属性, getattr 函数抛出 AttributeError 异常,或者返回 default 参数的值. hasattr(object, name)
如果 object 对象中存在指定的属性,或者能以某种方式(例如继承)通过 object 对象获取指定的属性,返回 True.
(https://docs.python.org/3/library/functions.html#hasattr)
这个函数的实现方法是调用 getattr(object, name) 函数,看看是否抛出 AttributeError 异常. setattr(object, name, value)
把 object 对象指定属性的值设为 value,前提是 object 对象能接受那个值.
这个函数可能会创建一个新属性,或者覆盖现有的属性. 相关的特殊方法,
在用户自己定义的类中,下述特殊方法分别用于获取、设置、删除和列出属性, 使用点号(obj.attr)或内置的 getattr、 hasattr 和 setattr 函数存取属性都会触发下述列表中相应的特殊方法.
但是,直接通过实例的 __dict__ 属性读写属性不会触发这些特殊方法(果需要,通常会使用这种方式跳过特殊方法).
(https://docs.python.org/3/reference/datamodel.html#special-method-lookup)中说道:
对用户自己定义的类来说,如果隐式调用特殊方法,仅当特殊方法在对象所属的类型上定义,而不是在对象的实例字典中定义时,
才能确保调用成功.
****** 也就是说,要假定特殊方法从类上获取,即便操作目标是实例也是如此.因此.特殊方法不会被同名实例属性遮盖. 以下论述中,假设类名为 Class, obj 是 Class 类的实例, attr 是 obj 的属性.
不论是使用点号(obj.attr)存取属性,还是使用前面所述的某个'内置函数'都会触发下述某个特殊方法.
如, obj.attr 和 getattr(obj, 'attr', 123) 会触发 Class.__getattribute__(obj, 'attr') 方法. __delattr__(self, name)
只要使用 del 语句删除属性,就会调用这个方法。如, del obj.attr 会调用 Class.__delattr__(obj, 'attr') 方法. __dir__(self)
  把对象传给 dir 函数时调用,列出属性. 例如, dir(obj) 触发 Class.__dir__(obj) 特殊方法. __getattr__(self, name)
仅当获取指定的属性失败, 搜索过 obj, Class 和超类之后调用. 表达式 obj.no_such_attr, getattr(obj, 'no_such_attr'),
hasattr(obj, 'no_such_attr') 可能会触发 Class.__getattr__(obj, 'no_such_attr') 特殊方法.
但是,仅当在 obj, Class 和超类中找不到指定的属性时才会触发. __getattribute__(self, name)
尝试获取指定的属性时总会调用这个方法,不过,寻找的属性是特殊属性或特殊方法时除外.
点号与 getattr 和 hasattr 内置函数会触发这个方法.调用 __getattribute__ 方法且抛出 AttributeError 异常时,
才会调用 __getattr__ 特殊方法. 为了在获取 obj 实例的属性时不导致无限递归,
__getattribute__ 方法的实现要使用 super().__getattribute__(obj, name). __setattr__(self, name, value)
尝试设置指定的属性时总会调用这个方法.点号(obj.attr)和 setattr 内置函数会触发这个方法.
比如, obj.attr = 123 和 setattr(obj, 'attr', 123) 都会触发 Class.__setattr__(obj, ‘attr’, 123) 特殊方法的调用.
 
其实, 特殊方法 __getattribute__ 和 __setattr__ 不管怎样都会调用, 几乎会影响每一次属性存取,
因此比 __getattr__ 方法(只处理不存在的属性名)更难正确使用.
结论, 与其自己定义这些特殊方法,不如使用特性或描述符相对不易出错.

The related functions and attributes for managing attributes - 操作属性的重要属性和函数的更多相关文章

  1. Attributes(2): Displaying attributes for a class.(显示类属性)

    输出类属性   using System; using System.Reflection;   namespace Attribute02 { //用于Class和Struct类型 [Attribu ...

  2. DateTime Related Functions

    string a = "to_date('" + dtpStart.Value.ToString("yyyy/MM/dd") + "', 'yyyy/ ...

  3. 5.24 Declaring Attributes of Functions【转】

    转自:https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html 5.24 Declaring Attributes o ...

  4. chattr lsattr linux file system attributes - linux 文件系统扩展属性

    我们使用 linux 文件系统扩展属性,能够对linux文件系统进行进一步保护:从而给文件 赋予一些额外的限制:在有些情况下,能够对我们的系统提供保护: chattr命令用来改变文件属性.这项指令可改 ...

  5. jquery 使用attr() 函数对复选框无效的原因,javascript那些事儿——properties和attributes

    复选框是网站开发的时候经常用到的网页标签之一,常见的在页面上对复选框的操作包括取值和修改复选框的状态.在jquery中,常见的操作标签的值得函数为attr,然而在操作复选框的时候,通常采用的却是pro ...

  6. jQuery Attributes vs. Properties

    Attributes vs. Properties attributes和properties之间的差异在特定情况下是很重要.jQuery 1.6之前 ,.attr()方法在取某些 attribute ...

  7. IOS,Object C学习过程中遇到的attributes

    @property 定义一个属性 @synthesize 告诉编译器自动为属性自动生成 getter 和setter方法 在定义属性的时候会用到如下@attributes nonatomic,告诉编译 ...

  8. 关于User&nbsp;Defined&nbsp;Runtime&nbsp;Attributes的小技巧

    在用XIB里自定制view,button,label...的一些属性时,例如边框宽度,边框颜色等,如下图:

  9. 关于textbox.attributes["value"]的问题

    在“修改”时,出现这个问题,后台点击修改时,应该是文本框出现一些初始值 BLL.manager bll = new BLL.manager(); Model.manager model = bll.G ...

随机推荐

  1. 七种武器:JavaScript 新特性闪亮登场

    JavaScript(或ECMA Script) 是一门不断发展的语言,有许多关于如何前进的建议和想法.TC39(技术委员会39)是负责定义JS标准和特性的委员会,今年他们非常活跃.以下是目前处于&q ...

  2. 怎样使用七牛云CDN加速并绑定阿里云域名

    昨天晚上在某个群里看到群友问,七牛云能不能绑定自己的域名作为静态资源文件的前缀,忽然想起来我已经有快两年时间没有登录过我的七牛云账号了,不禁老脸一红,这是有多久没有自己前后端都弄了,幸好还没有老年痴呆 ...

  3. 通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环

    本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然 ...

  4. sin 与 cos 的用法

    这两个函数使用过程中要,如 sin(x) , x 在这里表示的是弧度,至于弧度要如何计算呢 ? pi / 180 = 弧度 / 角度 内部的参数可以整数或者浮点数,以前面做过的一道题而言,大量的调用函 ...

  5. html转成pdf 下载,支持后台保存

    最近有个需求,需要将html转换成pdf并支持下载 1.需要两个js库 下载 提取码: vab7 <script type="text/javascript" src=&qu ...

  6. 2018南京现场赛K 随机输出

    题目链接:http://codeforces.com/gym/101981/attachments n和m太小,空地联通无环,总步数太大,直接随机输出5w个方向 #include<iostrea ...

  7. Java入门 - 语言基础 - 12.Number和Math类

    原文地址:http://www.work100.net/training/java-number-math.html 更多教程:光束云 - 免费课程 Number和Math类 序号 文内章节 视频 1 ...

  8. 【模板】2-SAT问题

    问题简述 有 \(n\) 个变量,每个变量可赋为 \(1\) 或 \(0\) 必须满足一些限制条件,如" \(a\) 为1 或 \(b\) 为0 " " \(a\) 为0 ...

  9. 在eclipse中用java调用python报错 Exception in thread "main" ImportError: Cannot import site module and its dependencies

    最近做项目需要用java调用python,配置了jython后,运行了例子代码: 获得一个元组里面的元素: import org.python.util.PythonInterpreter; publ ...

  10. 「 深入浅出 」集合List

    第一篇文章 「 深入浅出 」java集合Collection和Map 主要讲了对集合的整体介绍,本篇文章主要讲List相对于Collection新增的一些重要功能以及其重要子类ArrayList.Li ...