类中的特殊方法
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__是构造方法