魔法方法
一、Python 魔法方法详解
二、构造和析构
- 魔法方法总是被双下划线包围,例如:
__init__
方法 - 魔法方法是面向对象的Python的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的Python的强大
- 魔法方法的"魔力"体现在它们总能够在适当的时候被自动调用
(1)__init__(self[, ...])
在需要对对象进行初始化操作时,才会用到。
必须return None
不能另加return,会报错!
(2)__new__(cls[, ...])
实例化对象时,第一个被调用的方法。
默认执行,一般不需要重写。
需要重写的情况:当继承一个不可变类型,又需要修改的时候,那么它的特性就显得尤为重要。
eg:
>>> class CapStr(str):
def __new__(cls, string):
string = string.upper()
return str.__new__(cls, string)
>>> a = CapStr('Love')
>>> a
'LOVE'
这里的CapStr
是要继承str
,但是CapStr
又要把输入的字符串变成大写,str
没有这个性质,它是不能改变的,类CapStr
就成了继承str
且能把输入变大写的类
(3)__del__(self)
析构器。
当对象将要被销毁的时候,这个方法就会被调用。
并非del x
就相当于自动调用x.__del__()
,__del__
方法是当垃圾回收机制回收这个对象的时候调用的。
eg:
>>> class C:
def __init__(self):
print('我是__init__方法,我被调用了!')
def __del__(self):
print('我是__del__方法,我被调用了!')
>>> c1 = C()
我是__init__方法,我被调用了!
>>> c2 = c1
>>> c3 = c2
>>> del c3
>>> del c2
>>> del c1
我是__del__方法,我被调用了!
要删除所有的实例化对象时,才会被调用__del__
方法。
三、算术运算
eg:
>>> class Nint(int):
def __rsub__(self, other):
return int.__sub__(self, other)
>>> a = Nint(5)
>>> 2 - a
3
当执行反运算时,a
是self
,2
是other
。所以2 - a
其实是5-2,结果为3。
四、属性访问
__getattr__(self, name)
定义当用户试图获取一个不存在的属性时的行为
__getattribute__(self, name)
定义当该类的属性被访问时的行为
__setattr__(self, name, value)
定义当一个属性被设置时的行为
__delattr__(self, name)
定义当一个属性被删除时的行为
eg:
写一个矩形类,默认有宽和高两个属性;如果为一个叫square的属性赋值,那么说明这是一个正方形,值就是正方形的边长,此时宽和高都应该等于边长。
class Rectangle:
def __init__(self, width=0, height=0):
self.width = width
self.height = height
def __setattr__(self, name, value):
if name == 'square':
self.width = value
self.height = value
else:
super().__setattr__(name, value)
def getArea(self):
return self.width * self.height
运行:
>>> r = Rectangle(4, 5)
>>> r