阅读实际使用的开源项目如flask,对于提高编程能力有巨大好处。flask是实现网站功能,使用数据库的一个编程框架,已有中文出版有关书籍介绍。本系列讲座涉及的是非常精彩的The Flask Mega-Tutorial,开始于2017年12月6日开始,结束于2018年5月结束,每周一课。
对于一个不太大,但足够复杂的app的代理current_app的实现方法,本系列讲座进行彻底分析,分析过程像美食家需要慢慢品味精美大餐,以体会高明厨师的精巧设计和制作。本系列首先比较各种看起来像“属性”的东西,提示一下不常用的方法,相当于在吃主餐前,品尝精美餐前小吃。
系列一
餐前小吃(1),本文涉及
类属性与实例属性
类变量,实例变量
属性与__dict__
getattr、setattr函数
并不对称的__getattr__与__setattr__(flask要用)
如果已非常了解object.__setattr__
(self, name, value),直接跳过。
1、类属性与实例属性
属性是指下例格式
对象名.属性名
的所表示的对象,这个对象是指整个“对象名.属性名”所表示的对象,而不是其中对象名所表示的对象。根据对象名的不同,属性分为两类:
对象名是类的名称,表示类属性。例如如果A是一个类,则A.a是类属性。
对象名是实例的名称,表示实例属性。例如如果x是A的实例,则x.a是实例属性。
类属性的值:可以被此类的实例属性所共享,所以类属性的值是共享的。
实例属性的值:如果实例属性的值不是由共享而来,而是自己创建的,这个值是此实例专有的。修改实例属性,实际是创建了一个新对象,所以也是专有的。
下例程序中创建了一个类属性,就被实例属性所共享,但是一个实例属性的值被更改,不管原来是否共享而来,等价于新创建了一个对象,这是专有的。
>>>class A:
... pass
...
>>>x = A()
>>>y = A()
>>>A.a = '我是类属性' #创建类属性,会被共享
>>>x.a #将共享类属性
'我是类属性'
>>>y.a #将共享类属性
'我是类属性'
>>>x.a = '创建x的新属性' #更改属性等于新创, 创建专有属性,
>>>A.a
'我是类属性'
>>>x.a
'创建x的新属性'
>>>y.a
'我是类属性'
这里共享是指就是同一个,使用is可以清楚的看到:
>>>x.a is A.a False >>>y.a is A.a True
2、类变量,实例变量
属性的值也可以由定义在类中的类变量和实例变量所确定。
实例变量与类变量均在类中创建。实例变量在类的__init__方法中创建,并作为self的属性,所以仅属于self。类变量在方法外创建,一般位于类定义的开始部分,可以为此类的所有实例所共享。类变量创建后,可以在类中访问,但在类中定义的方法除外。在类中定义的函数中,使用self的属性来共享类变量。
类定义后(python扫描完类后),类变量就可以用类属性访问。
类的实例创建后,实例变量可以用实例属性作为self进行访问。
由于实例属性可以共享类属性,所以类变量也可以被实例属性共享。
下面是来自于官方文件
的例子,包含了实例变量与类变量,其中get_kind,get_n