zoukankan      html  css  js  c++  java
  • 类的构造方法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__是构造方法
    

      

      

      

      

      

      

  • 相关阅读:
    Ubuntu 12.04 git server
    Moonlight不再继续?!
    Orchard 视频资料
    一恍惚八月最后一天了
    Box2D lua binding and Usage
    50岁还在编程,也可以是一种成功
    DAC 4.2 发布
    再次祝贺OpenStack私有云搭建成功
    vue项目快速搭建
    pdf.js使用详解
  • 原文地址:https://www.cnblogs.com/zhuhaofeng/p/9563000.html
Copyright © 2011-2022 走看看