类中的特殊方法
1,类名()自动执行__init__ :
作用:初始化实例的变量
2,对象()自动执行__call__ :
# __call__ 实例执行的时候会执行此方法
class Foo:
def __call__(self, *args, **kwargs):
print(args,kwargs)
return 123 #__call__方法还有返回值
obj=Foo()
obj(22,33,k1=222)
ret=obj(22,33) #在这里可以接收下返回值
3,对象 [“xxx” ] 自动执行__getitem__ :
class Foo:
def __getitem__(self, item):
print(111)
return item
obj=Foo()
ret=obj['yu'] #可以通过这种方法把自己定义的类的实例做成类似列表的功能
print(ret)
4,对象 [“xxx” ] ==123 自动执行__setitem__ :
class Foo:
def __setitem__(self, item):
print(111)
return item
obj=Foo()
obj["k1"]=123 #这个是没有返回值的,在语法上就不允许,如果接收ret= obj["k1"]=123,就表示两个都等于123?这显然不是
5, del 对象 [“xxx” ] 自动执行__delitem__ :
class Foo:
def __setitem__(self, key):
print(111)
#这个方法没有返回值
obj=Foo()
del obj["k1"]
6,对象+对象 #相应的语法就对应了面向对象中的特殊的方法,面向对象中的特殊方法很多
class Foo():
def __init__(self,a1,a2):
self.a1=a1
self.a2=a2
def __add__(self, other):
return self.a1 + other.a2
obj1=Foo(1,2)
obj2=Foo(88,99)
ret=obj1+obj2
print(ret)
7,with 对象
class Foo():
def __init__(self,a1,a2):
self.a1=a1
self.a2=a2
def __enter__(self):
print(11111)
def __exit__(self, exc_type, exc_val, exc_tb):
print(2222)
obj1=Foo(1,2)
obj2=Foo(88,99)
with obj1:
#pass #要点,只要with遇到一个对象,就会立马执行类中的__enter__方法和__exit__方法,所以即便这里用占位符pass,类中的两个方法也会执行的
print("hello word") #当然在进入和退出之间也可以写一些自己的代码块
class Foo():
def __init__(self,a1,a2):
self.a1=a1
self.a2=a2
def __enter__(self):
print(11111)
return 666
def __exit__(self, exc_type, exc_val, exc_tb):
print(2222)
obj1=Foo(1,2)
obj2=Foo(88,99)
with obj1 as f: #在这里可以写一个as f 来接收一下__enter__方法的返回值
print(f)
print("hello word") #
8 正真的构造方法
class Foo():
def __init__(self,a1,a2):
print(1)
self.a1=a1
self.a2=a2
def __new__(cls, *args, **kwargs):
print(2)
pass
Foo(1,2) #__new__方法执行了,但是__init__方法没有执行,是因为__new__方法必须返回会一个值,对象才能创建
要想l两个方法都执行必须给__new__方法设置返回值
class Foo():
def __init__(self,a1,a2):
print(1)
self.a1=a1
self.a2=a2
def __new__(cls, *args, **kwargs):
return object.__new__(cls) #所有的对象都是object创建的,因为所有的对象都继承自object,
#所以创建对象的过程是这样的,object 创建一个空的当前类的对象,然后,__init__
#做初始化,再给对象里面填值
Foo(1,2)
#在其他语言中的构造方法是合在一起的,python中把他分开了,两个功能不一样
#所以一般这样说__init__是初始化方法
# __new__是构造方法