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是a5、__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)
相关文章推荐
- python四个魔法方法__len__,__getitem__,__setitem__,__delitem__
- python学习笔记之七:魔法方法,属性
- python学习之魔法方法的调用
- Python魔法方法指南
- Python学习之魔法方法、属性和迭代器
- Python基础教程——9魔法方法、属性及迭代器【总结】
- 零基础入门学习Python(24):魔法方法(4)描述符
- python中的魔法方法
- python 魔法方法
- Python基础教程 第9章: 魔法方法、属性和迭代器 学习笔记
- Python中的魔法方法
- Python基础编程(九)魔法方法、属性和迭代器
- python 魔法方法,属性,迭代
- Python 魔法方法详解
- Python中的魔法方法深入理解
- python 魔法方法之:__getitem__ __setitem__ __delitem__ __len__
- python 魔法方法,属性,迭代
- python基础教程_学习笔记11:魔法方法、属性和迭代器
- python魔法方法:__getattr__,__setattr__,__getattribute__
- 零基础入门学习Python(21):魔法方法(1)构造和析构