Day15&16 :魔法方法
魔法方法总是被双下划线包围,例如__init__
魔法方法是面向对象的 Python 的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的 Python 的强大
魔法方法的“魔力”体现在它们总能够在适当的时候被自动调用
构造方法
- _init_(self[,…])
类的初始化方法
class Rectangle:
def __init__(self,x,y):
slef.x=x
slef.y=y
def getPeri(self):
return(self.x+self.y)*2
def getArea(self):
return self.x*self.y
rect=Rectangle(3,4)
def getPeri()#14
def getPeri()#12
- _new_(cls[,…])
对象实例化时第一个调用的方法,它只取下 cls 参数,并把其他参数传给 init
class CapStr(str):
def __new__(cls,string):
string=string.upper()
return str.__new__(cls,string)
a=CapStr('I love Python!')
a#I LOVE PYTHON!
- _del_(self)
del 是对象的销毁器,但是需要注意的是,当Python解释器退出但对象仍然存活的时候, del 并不会 执行
class C:
def __init__(self):
print('我是init,我被调用了。。。')
def __del__(self):
print('我是del,我被调用了。。。')
c1=C()
#我是init,我被调用了。。。
c2 = c1
c3 = c2
del c3
del c2
del c1
#我是del,我被调用了。。
简单定制
"""制作一个简单计时器"""
import time as t
class MyTimer():
#开始计时
def start(self):
self.start=t.localtime()
print('计时开始!')
#内部方法,计算运行时间
def calc(self):
self.lasted=[]
self.prompt='总共运行了'
for index in range(6):
self.lasted.append(self.stop[index]-self.start[index])
self.prompt+=str(self.lasted[index])
print(self.prompt)
属性访问
函数 | 描述 |
---|---|
_getattr_(self, name) | 定义当用户试图获取一个不存在的属性时的行为 |
_getattribute_(self, name) | 定义当该类的属性被访问时的行为 |
_setattr_(self, name, value) | 定义当一个属性被设置时的行为 |
_delattr_(self, name) | 定义当一个属性被删除时的行为 |
描述符
描述符就是将某种特殊类型的类的实例指派给另一个类的属性
函数 | 描述 |
---|---|
_get_(self, instance, owner) | 用于访问属性,它返回属性的值 |
_set_(self, instance, value) | 将在属性分配操作中调用,不返回任何内容 |
_del_(self, instance) | 控制删除操作,不返回任何内容 |
定制序列
- 如果说你希望定制的容器是不可变的话,你只需要定义_len_()和_getitem_()方法。
- 如果你希望定制的容器是可变的话,除了_len_()和_getitem_()方法,你还需要定义_setitem_()和_delitem_()两个方法。
迭代器
- 迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。
- 迭代器是一个可以记住遍历的位置的对象。
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
- 迭代器只能往前不会后退。
- 字符串,列表或元组对象都可用于创建迭代器
常见迭代器
for i in 'Python':
print(i)
#P
#y
#t
#h
#o
#n
iter()
- _iter_()
- 用来生成迭代器
next()
- _next_()
- 返回迭代器的下一个项目
string='Python'
it=iter(string)
next(it)
'P'
next(it)
'y'
next(it)
't'
next(it)
'h'
next(it)
'o'
next(it)
'n'
#继续使用next会报错