了解完了描述器,我们终于可以向super进发了,不过在此之前先休息几天
python已经更新到3.7了,但是我们还是说说3.6
看了下官方说明,3.6多了一些比较奇怪的特性,比如
a=100_00_11_000
是不是很奇怪,说是增加了可读性,如果打印这个a,会得到什么
print(a)
>>>
1000011000
好吧,有点无聊...
还有这种表达式,反向增加可读性..
print('hello,your number is {:_}'.format(227389472394793247))
>>>
hello,your number is 227_389_472_394_793_247
可以看起来清晰一点,不过我不觉得我会用到...
我们刚刚讨论过的描述器又多了一个方法
set_name
之前我们是这样去触发描述器
class a:
def __get__(self, instance, owner):
print('world')
def __set__(self, instance, value):
print('hello')
class b:
field = a()
b().field
b().field=5
>>>
world
hello
现在再定义field=a()的时候,会触发set_name
class a:
def __get__(self, instance, owner):
print('world')
def __set__(self, instance, value):
print('hello')
def __set_name__(self, owner, name):
print('nihao')
print(self,owner,name)
print(type(name))
class b:
field = a()
b().field
b().field=5
>>>
nihao
<__main__.a object at> field
world
hello
可以看到定义的属性field名字被传了进来,是一个字符串。
注意是在定义的时候触发的,不是在实例化描述器对象时候触发的
a()
print('没有输出')
>>>
没有输出