您的位置:首页 > 编程语言 > Python开发

python魔法方法

2017-07-07 10:05 489 查看
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)//AA2、__init__() //构造方法不能有任何返回3、__del__() //对象将要被销毁,会自动被调用,跟php中的_destroy ,垃圾回收机制,当所有对象引用都被删除,才会调用eg:class YO:def __init__(self):print('111')def __del__(self):print('22')调用:yo = YO()yo1 = yodel yo //此时不会调用__del__del yo1 //两个都删掉才会调用__del__ 224、算数运算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) # -1
print(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.am.a = 2m.adel 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 = 11print(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.valueclass 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.aclass C:    a = A()    b = B()c = C()print(c.a)c.a = 11print(c.a)c.b = 10print(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) 
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: