类的构造方法1(类中的特殊方法)

类中的特殊方法

 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__是构造方法

  

  

  

  

  

  

 

posted @ 2018-08-30 22:07  solomon123  阅读(336)  评论(0)    收藏  举报