类的常用内置方法
- _ format _()
格式化输出
class date:
'hfgfghfgh'
def __init__(self,y,m,d):
self.y=y
self.m=m
self.d=d
def __format__(self, format_spec):
return '{0.y}{1}{0.m}{1}{0.d}'.format(self,format_spec)
d=date(2018,8,3)
print(format(d,'-'))
print(format(d,':'))
#输出
2018-8-3
2018:8:3
- _ str _()
把类转换成字符串
class dog:
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return 'name:%s age:%d'%(self.name,self.age)
d=dog('wawa',2)
print(str(d))#str(d)会调用__str__方法
print(d)# print会调用str()方法
#输出
name:wawa age:2
name:wawa age:2
_ getattr _()
当调用不存在的属性时候,这个方法会执行。不重写,系统默认的会报错class dog: def __init__(self,name): self.name=name def __getattr__(self,item): print('------>getattr') d=dog('毛毛') d.ooooooo #输出 ------>getattr
- _ delatttr _ ()
当删除属性的时候,会执行这个方法。不写也可以,系统由默认的
class dog:
def __init__(self,name):
self.name=name
def __getattr__(self,item):
print('------>getattr')
def __delattr__(self, item):
self.__dict__.pop(item)。 #__dict__是属性字典。这里不能这么写(del self.item),因为会进入无限递归
print(item+'已删除')
a=dog('wawa')
delattr(a,'name')
a.name
#输出
name已删除
------>getattr
- _ setattr_()
设置(增加和修改)一个属性时会执行这个方法。不写也可以,系统由默认的
class dog:
def __init__(self,name):
self.name=name
def __getattr__(self,item):
print('------>getattr')
def __delattr__(self, item):
self.__dict__.pop(item)
print(item+'已删除')
def __setattr__(self, key, value):
self.__dict__[key]=value #同样,这里也不能写self.key=value
print(key+'已设置')
a=dog('wawa')
delattr(a,'name')
a.name='haha'
print(a.name)
#输出
name已设置
name已删除
name已设置
haha
- __ iter __() 和 __ next __ ()
实现迭代器,参考之前的文章(迭代器,生成器)
class Fib:
def __init__(self,m):
self.n=0
self.a=1
self.b=1
self.m=m
def __iter__(self):
return self
def __next__(self):
if self.n==0:
self.n+=1
return self.a
elif self.n>=self.m:
raise StopIteration #raise是主动抛出异常用的
else:paoc
self.a,self.b=self.b,self.a+self.b
self.n+=1
return self.a
f=Fib(4)
for i in f:
#for循环会先调用__iter__方法,再连续调用__next__方法,如果捕捉到StopIteration这个异常就会停止for循环
print(i)
#输出
1
1
2
3