python中以__(双下划线)开头的方法,有特殊的作用,称之为魔法方法:
__init__
此方法为类的构造方法,实例化对象时调用此方法。
class A:
def __init__(self):
print('init A instance')
A() #打印init A instance
__str__
print 类对象时打印的是此方法返回的字符串(必须返回字符串)
class A:
def __str__(self):
return "customer str method"
print(A()) #打印 customer str method
__ repr__
此方法对开发者有效,显示变量调用时打印此方法返回字符串(必须返回字符串)
class A:
def __repr__(self):
return '<this is a instance of A>'
A() #打印<this is a instance of A>
__iter__,__next__
提供这两个方法可使对象能实现for ... in 循环,__iter__返回可迭代对象,此对象的__next__ 方法拿到循环的下一个值
class A:
def __iter__(self):
return B([1,2,3])
class B:
def __init__(self,arr):
self.arr = arr
self.index = -1
def __next__(self):
self.index += 1
if self.index > len(self.arr) - 1: # 退出循环的条件
raise StopIteration()
return self.arr[self.index]
for i in A():
print(i) #打印 1,2,3
__getitem__
此方法会在凋用索引方法时调用,取到第n个元素
class Fib:
def __getitem__(self,n):
a,b = 1,1
if isinstance(n,int):
for i in range(n):
a,b = b,a+b
return a
if isinstance(n,slice):
rtn = []
start,stop = n.start,n.stop
if start is None:
start = 0
for i in range(stop):
if(i >= start):
rtn.append(a)
a,b = b,a+b
return rtn
print(Fib()[3]) #打印3
print(Fib()[0:3]) #打印 1,1,2
__getattr__
此方法类似于ruby 的method_missing,在调用未定义的方法、属性时会调用此方法:
class A:
def __getattr__(self,name):
if name == 'action':
return lambda : "%s method is call" % name
return "%s attribute is call" % name
print(A().action()) # action method is call
print(A().aaa) #aaa attribute is call
#可在方法内raise AttributeError 对不干涉的方法、属性报错
__call__
可使对象变成可调用方法
class A:
def __call__(self):
print("call as a method")
A()() #call as a method
A()# 这种对象叫做Callable对象,可用callable方法判断 是否是该类对象
print(callable(A())) #True