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
原文地址:https://www.cnblogs.com/SkyRabbit/p/11341408.html