python的魔法方法(被双下划线包围) 所谓工厂函数就是类对象
1.构造方法
①__new__(cls[,...])
实例化对象时第一个被调用的方法
cls-->类 如果cls后还有参数,则参数会原封不动的传给init方法,new方法需要一个实例对象作为返回值(return),通常为cls
①__new__(cls[,...])
实例化对象时第一个被调用的方法
cls-->类 如果cls后还有参数,则参数会原封不动的传给init方法,new方法需要一个实例对象作为返回值(return),通常为cls
极少重写,但当继承一个不可变类型时需要重写new方法
__new__方法的调用是发生在__init__之前的。其实当 你实例化一个类的时候,具体的执行逻辑是这样的:
①.p = Person(name, age)
②.首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls, … …) 这样的方式),
③.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self
所以,__init__ 和 __new__ 最主要的区别在于:
(1)__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
(2)__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法。
②.首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls, … …) 这样的方式),
③.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self
所以,__init__ 和 __new__ 最主要的区别在于:
(1)__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
(2)__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法。
例一
>>> class CapStr(str):
def __new__(cls,string):
string = string.upper()
return str.__new__(cls,string) #调用基类的new方法
>>> class CapStr(str):
def __new__(cls,string):
string = string.upper()
return str.__new__(cls,string) #调用基类的new方法
>>> a = CapStr('i love someone')
>>> a
'I LOVE SOMEONE'
>>>
例二
假如我们需要一个永远都是正数的整数类型,通过集成int,我们可能会写出这样的代码。
>>> class PositiveInteger(int):
def __new__(cls, value):
return super(PositiveInteger, cls).__new__(cls, abs(value))
>>> i = PositiveInteger(-3)
>>> print(i)
3
>>>
>>> print(i)
3
>>>
②__init__(self[,...])
init方法下不能有return返回(或者说返回None)
不能对不可变类型的init方法进行重写
用于初始化对象的属性。__init__方法可以在创建对象的时候就设置好属性。
当创建对象以后,Python解释器会默认调用__init__(self)方法。
例:使用构造方法
>>> class Car:
#构造方法
def __init__(self):
self.color = '黑色'
>>> class Car:
#构造方法
def __init__(self):
self.color = '黑色'
>>> #创建一个对象,并用变量car保存它的引用
>>> car = Car()
>>> car.color
'黑色'
例:使用带参构造方法
>>> class Car:
#带参构造方法
def __init__(self,color):
self.color = color
>>> bwm = Car('香槟色')
>>> bwm.color
'香槟色'
2.析构方法
__del__(self)
当所有对象对类的引用都被del之后,才会调用__del__(self)方法(垃圾回收机制)
用于释放类所占用的资源
当删除一个对象来释放类所占用资源的时候,Python解释器会默认调用__del__(self)方法。
3.有关算术运算的魔法方法
__add__(self,other) 定义加法的行为+
__sub__(self,other) 定义减法的行为-
__mul__(self,other) 定义乘法的行为*
__truediv__(self,other) 定义真除法的行为/
__floordiv__(self,other) 定义整数除法的行为//
__mod__(self,other) 定义取模算法的行为%
__divmod__(self,other) 定义当被divmod()调用时的行为
__pow__(self,other[,modulo]) 定义当被power()调用或**运算时的行为
__add__(self,other) 定义加法的行为+
__sub__(self,other) 定义减法的行为-
__mul__(self,other) 定义乘法的行为*
__truediv__(self,other) 定义真除法的行为/
__floordiv__(self,other) 定义整数除法的行为//
__mod__(self,other) 定义取模算法的行为%
__divmod__(self,other) 定义当被divmod()调用时的行为
__pow__(self,other[,modulo]) 定义当被power()调用或**运算时的行为
4.反运算r
self为主,other为辅,当self不支持所用方法时,会调用other的方法
__radd__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用
与上方相同,当左操作数不支持相应的操作时被调用
例一
>>> class int(int):
def __radd__(self,other):
return int.__sub__ (self,other)
>>> class int(int):
def __radd__(self,other):
return int.__sub__ (self,other)
>>> a = int(2)
>>> b = int(6)
>>> a + b
8
>>> 2 + b
4
>>>
例二(1)
>>> class int(int):
def __rsub__(self,other):
return int.__sub__ (self,other)
>>> a = int(5)
>>> 3 - a
2
>>>
#self传入的是a
例二(2)
>>> class int(int):
def __rsub__(self,other):
return int.__sub__ (other,self)
>>> a = int(5)
>>> 3 - a
-2
>>>
5.增量赋值运算
__iadd__(self.other) 定义赋值加法的行为: +=
6.一元操作符
__neg__(self) 定义正号的行为:+x
__pos__(self) 定义负号的行为:-x
__abs__(self) 定义当被abs()调用时的行为
__invert__(self) 定义按位求反的行为:~x
__pos__(self) 定义负号的行为:-x
__abs__(self) 定义当被abs()调用时的行为
__invert__(self) 定义按位求反的行为:~x
7.其他运算符重载
__bool__ 真值测试 测试对象是否为真值:bool(x)
__repr__ __str__ 打印,转换 print repr str
__contain__ 成员测试 item in x
__getitem__ 索引,切片 x[i] x[i:j] 没有__iter__的for循环等
__setitem__ 索引赋值 x[i]=值
__delitem__ 索引和分片删除 del x[i]
__len__ 求长度 len(x)
__iter__ __next__ 迭代 iter() next() for循环等
--------------------------------------------------------------------------------------------------------------------------------
常用特殊方法
方法 功能说明
__init__() 构造函数,生成对象时调用
__del__() 析构函数,释放对象时调用
__add__() 左
__sub__() -
__mul__() *
__div__()__truediv__() /.x使用.x使用
__floordiv__() 整除
__mod__() %
__pow__() **
__cmp__() 比较运算
__repr__() 打印、转换
__setitem__() 按照索引赋值
__getitem__() 按照索引获取值
__len__() 计算长度
__call__() 函数调用
__contains__ () 测试是否包含某个元素
__eq__()、 __ne__()、__lt__()、 __le__()、__gt__()、__ge__() == != < <= > >=
__str__() 转化为字符串
__lshift__() <<
__and__() &
__or__() |
__invert__() ~
__iadd__() +=
常用特殊方法
方法 功能说明
__init__() 构造函数,生成对象时调用
__del__() 析构函数,释放对象时调用
__add__() 左
__sub__() -
__mul__() *
__div__()__truediv__() /.x使用.x使用
__floordiv__() 整除
__mod__() %
__pow__() **
__cmp__() 比较运算
__repr__() 打印、转换
__setitem__() 按照索引赋值
__getitem__() 按照索引获取值
__len__() 计算长度
__call__() 函数调用
__contains__ () 测试是否包含某个元素
__eq__()、 __ne__()、__lt__()、 __le__()、__gt__()、__ge__() == != < <= > >=
__str__() 转化为字符串
__lshift__() <<
__and__() &
__or__() |
__invert__() ~
__iadd__() +=