魔法方法
简单定制
import time as t
class Mytimer():#开始计时
def __init__(self):
self.lasted = []
self.prompt = "未开始计时"
self.begin = 0
self.end = 0
def __str__(self):
return self.prompt
def __repr__(self):
return self.prompt
def start(self):
self.begin = t.localtime()
print("计时开始。。。")
#停止计时
def stop(self):
self.end = t.localtime()
#self._calc()
print("计时结束!")
#内部方法,计算运行时间
def _calc(self):
self.lasted = []
self.prompt = "总共运行了"
for index in range(6):
self.lasted.append(self.end[index]-self.begin[index])
self.prompt +=str(self.lasted[index])
print(self.prompt)
属性访问
property函数
以下是 property() 方法的语法:
class property([fget[, fset[, fdel[, doc]]]])
'''
参数
fget -- 获取属性值的函数
fset -- 设置属性值的函数
fdel -- 删除属性值函数
doc -- 属性描述信息
'''
class C:
def __init__(self,size =10):
self.size = size
def getSize(self):
return self.size
def setSize(self,value):
self.size = value
def delSize(self):
del self.size
x = property(getSize,setSize,delSize)
c = C()
print(c.size)
c.x = 1
print(c.size)
del c.size
print(c.size)
class rectangle:
def __init__(self,width = 0,height = 0):
self.width = width
self.height = height
def __setattr__(self, name, value):
if name == 'square':
self.width = value
self.height = value
else:
super().__setattr__(name,value)
#基类
def getArea(self):
return self.width *self.height
r1 = rectangle(4,5)
print(r1.getArea())
r1.square = 10
print(r1.height)
print(r1.width)
print(r1.getArea())
说明:
super()函数用于调用父类(超类)的一个方法。
描述符
描述符就是将某种特殊类型的类的实例指派给另一个类的属性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-073Lg22x-1605796279117)(C:\Users\吴双双\AppData\Roaming\Typora\typora-user-images\image-20201104120448919.png)]
class MyDecriptor:
def __get__(self, instance, owner):
print("getting...",self,instance,owner)
def __set__(self,instance,value):
print("setting...",self,instance,value)
def __delete__(self, instance):
print("deleting...",self,instance)
class Test:
x = MyDecriptor()
test = Test()
test.x
定制序列
协议(Protocols)与其他编程语言中的接口很相似,它规定你哪些方法必须要定义。然而,在python中的协议就显得不那么正式。事实上,在python中,协议更像是一种指南。
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]
说明:
fromkeys() 函数用于创建一个新字典,语法如下:
dict.fromkeys(seq[, value])
#seq--字典键值列表
#value--可选参数,设置键序列(seq)对应的值,默认为None.
#返回值--一个新字典
迭代器
__iter():返回迭代器本身
next():获取下一个数
斐波那契数列
class Fibonacci(object):
"""斐波那契数列迭代器"""
def __init__(self, n):
"""
:param n:int 指 生成数列的个数
"""
self.n = n
# 保存当前生成到的数据列的第几个数据,生成器中性质,记录位置,下一个位置的数据
self.current = 0
# 两个初始值
self.a = 0
self.b = 1
def __next__(self):
"""当使用next()函数调用时,就会获取下一个数"""
if self.current < self.n:
self.a, self.b = self.b, self.a + self.b
self.current += 1
return self.a
else:
raise StopIteration
def __iter__(self):
"""迭代器的__iter__ 返回自身即可"""
return self
if __name__ == '__main__':
fib = Fibonacci(15)
for num in fib:
print(num)
生成器
协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。
斐波那契数列
方法二
def fibs():
a = 0
b = 1
while True:
a,b = b,a+b
yield a
for i in fibs():
if i>100:
break
print(i,end=" ")
列表推导式
a = [i for i in range(100) if not (i % 2)and i % 3]
print(a)
#能被2整除但不能被3整除
字典推导式
b = {i : i % 2 ==0 for i in range(10)}
print(b)
集合推导式
c = {i for i in [1,1,1,2,3,4,5,5,7,8,6,5,3,2]}
print(c)
#输出结果为{1,2,3,4,5,6,7,8}