python魔法方法

来源:互联网 发布:mac好看的电子相册 编辑:程序博客网 时间:2024/04/30 15:40
1、__new__() //实例化对象调用第一个方法并不是__init__而是__new__,一般Python默认调用,一般只有在继承了不可变的类要去修改里面内容,需要重写
eg:
    class CapStr(str):
        def __new__(cls,string):
        string = string.upper()
        return str.__new__(cls,string)
调用:
cap = CapStr('aa')
print(cap)//AA

2、__init__() //构造方法不能有任何返回
3、__del__() //对象将要被销毁,会自动被调用,跟php中的_destroy ,垃圾回收机制,当所有对象引用都被删除,才会调用
eg:
class YO:
def __init__(self):
print('111')
def __del__(self):
print('22')
调用:
yo = YO()
yo1 = yo
del yo //此时不会调用__del__
del yo1 //两个都删掉才会调用__del__ 22

4、算数运算
4.1 正向运算
class New_int(int):    def __add__(self, other):        return int.__sub__(self,other)    def __sub__(self, other):        return int.__add__(self, other)a = New_int(2)b = New_int(3)print(a+b) # -1print(a-b) # 5
4.2 逆向运算
class New_int(int):    def __radd__(self, other):        return int.__sub__(self,other)a = 3b = New_int(2)print(a+b) #-1,因为3不是New_int,找不到,就会执行b的逆向运算radd,self是b,other是a



 5、__setattr__()、__getattr()__、__getattribute()__、__delattr__()
__setattr__():对象给属性赋值会调用此方法
__getattribute__():读取对象属性调用此方法(不管属性是否存在都会调用)
__getattr__():对象属性不存在才会调用,此方法在__getattribute__()之后调用
__delattr__():删除一个对象的属性,调用此方法

class MyTime:
    def __setattr__(self,name,val):
        print('setattr')
        return super().__setattr__(name,val)
    def __getattribute__(self,name):
        print('getattribute')
        return super().__getattribute__(name)
    def __getattr__(self,name):
        print('getattr')
    def __delattr__(self,name):
        print('delattr')
        return super().__delattr__(name)
m = MyTime()
m.a
m.a = 2
m.a
del m.a

 
6、描述符__get__ 、__set__、__delete__
实例一:
class MyProperty:
    def __init__(self,fget=None,fset=None,fdel=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
    def __set__(self,instance,val):
        self.fset(instance,val)
    def __get__(self,instance,owener):
        return self.fget(instance)
    def __delete__(self,instance):
        self.fdel(instance)
class C:
    def __init__(self):
        self._x = 0
    def getContent(self):
        return self._x
    def setContent(self,val):
        self._x = val
    def delContent(self):
        del self._x
    x = MyProperty(getContent,setContent,delContent)
c = C()
print(c.x)
c.x = 11
print(c.x)
 
实例二:
class A:
    def __init__(self,value=0):
        self.value = value
    def __set__(self,instance,val):
        self.value = val
    def __get__(self,instance,owener):
        return self.value

class B:
    def __init__(self,value=0):
        self.value = value
    def __set__(self,instance,val):
       instance.a = val + 1
    def __get__(self,instance,owener):
        return   instance.a

class C:
    a = A()
    b = B()
c = C()
print(c.a)
c.a = 11
print(c.a)
c.b = 10
print(c.a)
print(c.b)

 


7、定制序列
class Test:
    def __init__(self,*args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(range(len(self.values)),0)
    def __len__(self):
        return len(self.count)
    def __getitem__(self,key):
        self.count[key] += 1
        return self.values[key]
t = Test(1,2,3,4,5,6)
print(t[1])
print(t[2])
print(t[1])
print(t.count) 
原创粉丝点击