zoukankan      html  css  js  c++  java
  • python面向对象(5)__特殊双下方法

    双下方法

    双下方法是开发python这个语言程序员用的,源码中使用的.
    我们不能轻易使用双下方法.可能重新写object的源码,慎用!!!
    双下方法特征:你不知道干啥了,就会触发某个双下方法

    len

    class B:
        def__len__(self):
            print("666")
            return  555
    b=B()
    len(b)
    打印结果如下
    666
    

    hash

    class A:
        pass
    obj=A()
    print(obj)
    打印结果如下
    可哈希值
    

    str

    优先级高于repr

    class A:
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def __str__(self):
            return f"姓名:{self.name}年龄{self.age}"
    a=A("sykrabbit ",20)
    print(a)
    
    打印结果如下
    姓名:sykrabbit 年龄20 
    

    repr

    优先级低于str
    必须有return

    class A:
         def __init__(self,name,age):
            self.name=name
            self.age=age
        def __repr__(self)
            print(66)
    
    打印结果如下
    66
    

    call

    对象()自动触发对象从属于类(父类)的__call__方法
    object没有call方法

    class Foo:
        def __init__(self):
            pass
        def __call__(self, *args, **kwargs):
            print('__call__')
    
    obj = Foo() # 执行 __init__
    obj()       # 执行 __call__
    打印结果如下
    __call__
    

    eq

    比较大小

    class A:
         def __init__(self,name,age):
            self.name=name
            self.age=age
        def __eq__(self,obj):
            if  self.a == obj.a and self.b == obj.b:
                return True
    a = A()
    b = A()
    print(a == b)
    打印结果如下
    True
    

    del

    析构方法

    class A:
        def __del__(self):
            print(666)
    obj=A()
    打印结果如下
    666
    

    new

    在内存当中开辟一个空间产生对象

    class A:
        def __init__(self):
            self.x = 1
            print('in init function')
        def __new__(cls, *args, **kwargs):
            print('in new function')
            return object.__new__(A, *args, **kwargs)
    #对象是object类的__new__方法 产生了一个对象
    a = A()
    #类名()
    #1.先触发object的__new__方法,此方法在内存中开辟一个对象空间
    #2.先执行__init__方法,给对象封装属性
    print(a.x)
    打印结果如下
    in new function
    in init function
    

    单例模式
    单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
    一个类只允许实例化一个对象

    __item__系列

    进行类型字典的增删改查

    class Foo:
        def __init__(self,name):
            self.name=name
    
        def __getitem__(self, item):
            print(self.__dict__[item])
    
        def __setitem__(self, key, value):
            self.__dict__[key]=value
        def __delitem__(self, key):
            print('del obj[key]时,我执行')
            self.__dict__.pop(key)
        def __delattr__(self, item):
            print('del obj.key时,我执行')
            self.__dict__.pop(item)
    f1=Foo('sb')
    f1['age']=18
    f1['age1']=19
    del f1.age1
    del f1['age']
    f1['name']='alex'
    print(f1.__dict__)
    

    上下文管理器相关

    enter __exit__都是成对的出现

    # 如果想要对一个类的对象进行with  as 的操作 不行。
    class A:
        def __init__(self, text):
            self.text = text
    
    with A('大爷') as f1:
        print(f1.text)
    
    没他们不可以这样操作
    
    class Diycontextor:
        def __init__(self,name,mode):
            self.name = name
            self.mode = mode
     
        def __enter__(self):
            print "Hi enter here!!"
            self.filehander = open(self.name,self.mode)
            return self.filehander
     
        def __exit__(self,*para):
            print "Hi exit here"
            self.filehander.close()
     
     
    with Diycontextor('py_ana.py','r') as f:
        for i in f:
            print i
    
  • 相关阅读:
    小清新数论题泛做
    近日模考理数压轴题简记
    带边数的无向连通图计数
    ZJOI2019 简记
    SDOI2019 R2D2 题解
    [补档题解]后缀树节点数
    [BJ United Round 3] 押韵
    高维 DFT 算法(FWT 快速沃尔什变换)
    SDOI2019 R2D1 题解
    LOJ#6713. 「EC Final 2019」狄利克雷 k 次根 加强版
  • 原文地址:https://www.cnblogs.com/SkyRabbit/p/11341408.html
Copyright © 2011-2022 走看看