Python 训练 Day 13-14 魔法方法
静水流深 2019.11.04
魔法方法
魔法方法总是被双下划线包围。魔法方法是python的一切。魔法方法总是在适当的时候被自动调用。
构造与解析
__ init __(self [ , …] )
class Rectangle:
def __init__(self,x,y):
self.x = x
self.y = y
def getPeri(self):
return (self.x+self.y)*2
def getArea(self):
return self.x*self.y
rect = Rectangle(3,4)
rect.getPeri()#14
rect.getArea()#12
注意 init 不能返回值!!
__ new __(cls [ , …] )
第一个被调用的方法是 new 方法。new 后面不是self,而是class,它返回一个class实例对象。如果new后面有参数,参数会被原封不动的传递给 init 方法。
我们平时不太使用new方法,但是当我们继承并需要修改一个不可变类的时候。
class Capstr(str)
def __new__(cls,string):
string=string.upper()
return string.__new__(cls,string)
a = Capstr('abc')
a#ABC
__del __(self)
首先注意 del x != x.del()。这是垃圾回收机制。
class A :
def __init__(self):
print("init被调用")
def __del__(self):
print("del被调用")
a1 = A()#init被调用
a2 = a1
a3 = a2
del a3
del a2
del a1#del被调用
del(self) 被调用不是因为发生del操作就被引用,而是对象生成之后,所有对他的引用都被del之后才会启用垃圾回收机制,就会自动清理。
工厂函数
举例子
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(3)
b = New_int(5)
a + b #-2
__ str __ 和 __ repr __
__ str__
class A ():
def __str__():
return "Hh"
a = A()
print(a)#Hh
__ repr __
class B ():
def __repr__():
return "Hh"
b = B()
b#Hh
属性访问
property可以以属性的形式访问属性。
class A :
def __init__(self,size=10):
self.size = size
def getSize(self):
return self.size
def setSize(self,value):
self.size = value
def delSize(self):
del self.size
x = property(getSize,setSize,delSize)
a = A()
a.x = 1
a.size#1
__ getattr __(self,name)定义当用户试图获取一个不存在的属性时的行为
__ getattribute __(self,name)定义当该类的属性被访问时候的行为
__ setattr __ (self,name,value)定义当一个属性被设置时的行为
__ delseer __(self,name)定义当一个属性被删除时的行为
顺序
class A :
def __getattribute__(self,name):
print('getattribute')
return super.__getattribute__(name)
def __getattr__(self,name):
print('getattr')
def __setattr__ (self,name,value):
print('setattr')
super().__setattr__ (self,name,value)
def __delattr__ (self,name):
print('delattr')
return super.__delattr__(name)
a = A()
a.x #getattribute
#getattr
也就是说getattribute先于getattr
描述符
描述符就是将某种特殊类型的类的实例指派给另一个类的属性
__ get __(self,instance,owner) 用于访问属性,返回属性的值。
__ set __(self,instance,value) 将在属性分配操纵中调用,不返回任何内容。
__ delete __(self,instance) 控制删除操作,不返回任何内容。
容器
协议类似于C++中的接口,但是在python,协议更像是指南。
定制容器类型的协议
不可变容器,只需要定义__ len ()和 getitem ()方法。
可变容器,除了定义 len ()和 getitem ()方法,还要定义 setitem ()和 delitem __()方法。