魔法函数
python中以双下划线开始和结束的函数(不可自己定义)为魔法函数
调用类实例化的对象的方法时自动调用魔法函数(感觉不需要显示调用的函数都叫)
在自己定义的类中,可以实现之前的内置函数,比如下面比较元素sorted时用It函数(lt(self, other):判断self对象是否小于other对象;)
class MyVector(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other_instance):
re_vector = MyVector(self.x+other_instance.x, self.y+other_instance.y)
return re_vector
def __str__(self):
return"x:{x}, y:{y}".format(x=self.x, y=self.y)
first_vec = MyVector(1,2)
second_vec = MyVector(2,3)
print(first_vec+second_vec)
操作符重载:通过定义类的一些约定的以"__"开头并结尾的函数,可以到达重载一些特定操作的目的
__str__ / __unicode__
当print一个对象实例时,实际是print该实例 .str()函数的返回值:
class A:
def __str__(self):
return "A"
def __unicode__(self):
return "uA"
魔法函数有什么作用?
魔法函数可以为你写的类增加一些额外功能,方便使用者理解。举个简单的例子,我们定义一个“人”的类People,当中有属性姓名name、年龄age。让你需要利用sorted函数对一个People的数组进行排序,排序规则是按照name和age同时排序,即name不同时比较name,相同时比较age。由于People类本身不具有比较功能,所以需要自定义,你可以这么定义People类:
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
return
def __str__(self):
return self.name + ":" + str(self.age)
def __lt__(self, other):
return self.name < other.name if self.name != other.name else self.age < other.age
if __name__=="__main__":
print("\t".join([str(item) for item in sorted([People("abc", 18), People("abe", 19), People("abe", 12), People("abc", 17)])]))
上个例子中的__lt__函数即less than函数,即当比较两个People实例时自动调用。
Python中有哪些魔法函数?
Python中每个魔法函数都对应了一个Python内置函数或操作,比如__str__对应str函数,__lt__对应小于号
类的构造、删除:
object.__new__(self, ...)
object.__init__(self, ...)
object.__del__(self)
二元操作符:
+object.__add__(self, other)
-object.__sub__(self, other)
*object.__mul__(self, other)
//object.__floordiv__(self, other)
/object.__div__(self, other)
%object.__mod__(self, other)
**object.__pow__(self, other[, modulo])
<
>>object.__rshift__(self, other)
&object.__and__(self, other)
^object.__xor__(self, other)
|object.__or__(self, other)
扩展二元操作符:
+=object.__iadd__(self, other)
-=object.__isub__(self, other)
*=object.__imul__(self, other)
/=object.__idiv__(self, other)
//=object.__ifloordiv__(self, other)
%=object.__imod__(self, other)
**=object.__ipow__(self, other[, modulo])
<<=object.__ilshift__(self, other)
>>=object.__irshift__(self, other)
&=object.__iand__(self, other)
^=object.__ixor__(self, other)
|=object.__ior__(self, other)
一元操作符:
-object.__neg__(self)
+object.__pos__(self)
abs()object.__abs__(self)
~object.__invert__(self)
complex()object.__complex__(self)
int()object.__int__(self)
long()object.__long__(self)
float()object.__float__(self)
oct()object.__oct__(self)
hex()object.__hex__(self)
round()object.__round__(self, n)
floor()object__floor__(self)
ceil()object.__ceil__(self)
trunc()object.__trunc__(self)
比较函数:
<=object.__le__(self, other)
==object.__eq__(self, other)
!=object.__ne__(self, other)
>=object.__ge__(self, other)
>object.__gt__(self, other)
类的表示、输出:
str()object.__str__(self)
repr()object.__repr__(self)
len()object.__len__(self)
hash()object.__hash__(self)
bool()object.__nonzero__(self)
dir()object.__dir__(self)
sys.getsizeof()object.__sizeof__(self)
类容器:
len()object.__len__(self)
self[key]object.__getitem__(self, key)
self[key] = valueobject.__setitem__(self, key, value)
del[key] object.__delitem__(self, key)
iter()object.__iter__(self)
reversed()object.__reversed__(self)
in操作object.__contains__(self, item)
字典key不存在时object.__missing__(self, key)