1.__call__方法
class Foo:
def __call__(self, *args, **kwargs):
print(58)
obj = Foo()
obj() #对象后面加括号,触发__call__方法
2.__int__方法/__str__方法
class Foo:
def __int__(self):
return 12 #该方法必须返回整型
def __str__(self):
return 'apple' #该方法必须返回字符串
obj = Foo()
print(int(obj)) #__int__方法的触发方式
print(obj) #__str__方法的触发方式
print(str(obj)) #__str__方法的另一种触发方式
3.__add__方法
class Foo:
def __init__(self,n,a):
self.name = n
self.age = a
def __add__(self, other): #self接收第一个对象,other接收第二个对象
return self.age + other.age
obj1 = Foo('alex',12)
obj2 = Foo('eric',21)
r = obj1 + obj2 #'obj1 + obj2'触发__add__方法
print(r)
4.__dict__方法:将对象中封装的所有内容以字典的形式返回
class Foo:
def __init__(self,n,a):
self.name = n
self.age = a
obj = Foo('alex','15')
d = obj.__dict__ #__dict__方法的触发方式
print(d)
5.__getitem__/__setitem__/__delitem__方法
1 class Foo:
2 def __init__(self,name,age):
3 self.name = name
4 self.age = age
5 def __getitem__(self, item):
6 if type(item) == int: #索引触发时,item接收的是int型
7 return item + 5
8 else: #否则就是切片触发,item接收的是slice类型
9 print(item.start,item.step,item.stop)
10 def __setitem__(self, key, value):
11 print(key,value)
12 def __delitem__(self,key):
13 print(key)
14 obj = Foo('alex',18)
15 print(obj[8]) #此处索引obj[8]触发__getitem__方法,8被传给了item
16 obj[1:3:2] #此处切片触发的也是__getitem__方法。1,3,2分别被item.start,item.step,item.stop接收
17 obj[100] = 'dsf' #该句触发__setitem__方法,100被传给了key,'dsf'被传给了value
18 del obj[2] #该句触发__delitem__方法,2被传给了key
19 '''注意:以上三种类似于列表的索引、切片/赋值/删除操作,但并没有实现这些功能,仅仅是一种触发方法的对应关系'''
6.__iter__方法
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def __iter__(self): #iter方法的作用是生成一个迭代器
return iter([11,12,13])
obj = Foo('alec',12) #带有iter方法的对象是可迭代对象,例如obj就是这样的对象
for i in obj: #for循环如果遇到的是可迭代对象,会先触发其iter方法拿到迭代器,然后用next方法遍历
print(i)
7.metaclass
class mytype(type):
def __call__(self, *args, **kwargs):
print(125)
class Foo(object,metaclass=mytype): #metaclass规定Foo是mytype的对象(默认情况下Foo是type的对象)
pass
obj = Foo() #obj是Foo的对象,Foo又是mytype的对象。python中对象是单向的