描述符

描述符

描述符就是将某种特殊类型的类的实例指派给另一个类的属性。

property就是一个描述符类

class MyDecriptor:
def get(self, instance, owner):
print(‘getting’,self,instance,owner)
def set(self, instance, value):
print(‘setting’,instance,value)
def delete(self, instance):
print(‘deleing’,self,instance)

class Test:
x = MyDecriptor()

test = Test()
test.x
getting <main.MyDecriptor object at 0x0000018BEE961490> <main.Test object at 0x0000018BEE7CC220>
test

<main.Test object at 0x0000018BEE7CC220>

Test

定制序列

协议(Protocols)

容器类型的协议

如果希望定制的容器是不可变的话,只需要定义1en__()和 getitem__()方法

如果希望定制的容器是可变的话,除了len()和getitem()方法,你还需要定义 setitem()和delitem()两个方法。

练习要求

编写一个不可改变的自定义列表,要求记录列表中每个元素被访问的次数。

class Countlist:
def init(self, *args):
self.values = [x for x in args]
self.count = {}.fromkeys(range(len(self.values)),0)

def __len__(self):
    return len(self.values)

def __getitem__(self, key):
    self.count[key] += 1
    return self.values[key]

c1 = Countlist(1,3,5,7,9)
c2 = Countlist(2,4,6,8,10)
c1[1]
3
c2[2]
6
c1[1] + c2[2]
9
c1.count
{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}

迭代器

python提供的两个BIF

iter()
next()

string = ‘hello’
it = iter(string)
it

<str_iterator object at 0x0000019DAA8DF070>

next(it)
‘h’
next(it)
‘e’
next(it)
‘l’
next(it)
‘l’
next(it)
‘o’
next(it)

while True:
try:
each = next(it)
except StopIteration:
break
print(each)

h
e
l
l
o

class Fibs:
def init(self):
self.a = 0
self.b = 1
def iter(self):
return self
def next(self):
self.a,self.b = self.b,self.a + self.b
return self.a

fibs =Fibs()
for x in fibs:
print(x)

生成器

yield

所谓的协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。

模块

导入模块

第一种: import 模块名
第二种: from 模块名 import 函数名
第三种: import 模块名 as 新名字

name = ‘main‘ 模块测试
可以判断哪个模块是调用, 哪个是被调用
致清 wechat
微信扫描二维码,和我一起探讨学习!