今天终于要开始学习魔法方法了,上周一的讨论班时就开始看, 到今天才正式能看进去。。
温故知新,稳扎稳打,不要急
第十二章 魔法方法
__init__(self) 方法
需要注意两点:
class Rectangle:
def __init__(self,x,y): 首先要对变量进行这样的一个调用说明
self.x = x
self.y = y
def getperi(self):
return self.x + self.y
def getarea(self):
return self.x * self.y
__init__ 方法的返回值一定是None,不能是其他
![](https://i-blog.csdnimg.cn/blog_migrate/f469744bc24e58430dec5049e11acd51.png)
__new__(cls) 方法
需要返回一个实例对象
class Capstr(str):
def __new__(cls,string):
string = string.upper() 全部变成大写
return str.__new__(cls,string) 返回str.__new__(cls,string),是一个具体的实例对象
__del__(self)
当对象要被销毁时,这个方法就会被调用,注意:是所有和这个有关的变量
(我的浅显的理解只能到这儿了,,,)
BIF(builtin function or function)内置函数或方法
int( ) 整形
float( ) 浮点型
str( ) 字符串
list( ) 列表
tuple( ) 元组
反运算
__radd__(self,other)
但是要注意,反运算分主动和被动,如果a对象的魔法方法没有实现或者不支持相应的操作,Python就会自动调用b的魔法方法
class Nint(int):
def __radd__(self,other):
return int.__radd__(self,other)
a = Nint(5)
b = Nint(3)
那么 a + b 结果应该是5+3 = 8 因为a 的魔法方法“+” 触动了 __add__
而 1 + b ,1的魔法方法找不到,所以找b的魔法方法,触动 __radd__ ,结果是 b - 1 = 3 - 1 = 2
(反运算里,self是b, other 是 1, 所以是 b -1)
class Nint(int):
def __rsub__(self,other):
return int.__sub__(self,other)
a = Nint(5)
3 - a = ?
3找sub没有找到,就去找a的rsub,此时a是self,3是other,即 a - 3 = 5 - 3 = 2
增量赋值运算
a = a + b
a + = b
一元操作符
__neg__(self) 定义正号的行为
__pos__(self) 定义负号的行为
__abs__(self) 取绝对值
__invert__(self) 定义接位求反的行为
下次看44 简单定制
课后习题:
2 什么时候我们需要在类中明确写出 __init__方法?
当我们的实例对象需要有明确的初始化步骤的时候,可以在__init__方法中部署初始化的代码
class C2F(float):
def __new__(cls,arg=0.0):
return float.__new__(cls,arg*1.8+32)
下次看188 鸭子类型