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

      

      

      

      

      

      

  • 相关阅读:
    Django简介和安装
    CVE-2011-0104:Microsoft Office Excel 中的栈溢出漏洞调试分析
    Struts2漏洞
    JSONP跨域资源共享的安全问题
    如何以最简单的方式安装 KALI 渗透测试框架系统
    CVE-2010-3333:Microsoft RTF 栈溢出漏洞调试分析
    CVE-2010-2883:基于样本分析 PDF SING表字符溢出漏洞
    针对缓冲区保护技术(ASLR)的一次初探
    利用 ROP 技术绕过 DEP 保护的一次简单尝试
    缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)
  • 原文地址:https://www.cnblogs.com/zhuhaofeng/p/9563000.html
Copyright © 2020-2023  润新知