Python中,在名字后面和前面加上双下划线表示魔法方法。如果类实现了这些方法中的某一个,那么Python就会在特殊情况下调用这个函数。这些函数几乎不被用户直接调用。
1.构造方法
Python中__init__()被当作构造方法。同时Python中还有个__del__()的魔法方法,也就是析构方法,它是在对象被垃圾回收回收之前调用。子类的初始化方法一般都要初始化父类的成员,可以通过两种方案完成:一是调用未绑定的超类的构造方法;二是通过super函数调用,调用super函数时需要将当前类和当前类的对象(可命名为self)作为参数,super函数返回超类,然后通过返回的超类调用超类的构造方法。
class Bird:
def __init__(self):
self.hungry = False
def eat(self):
if(self.hungry):
print ('Eating')
else:
print ('No thanks')
#实现方案1
class SingBird(Bird):
def __init__(self):
Bird.__init__(self) #直接调用未超类绑定的构造方法
def sing(self):
print ('Singing')
#实现方案2
class SongBird(Bird):
def __init__(self):
super(SongBird,self).__init__() #利用super函数返回超类
def sing(self):
print ('Singing')
bird = SongBird()
bird.eat()
bird.hungry = True
bird.eat()
【注】未绑定的构造方法指直接通过类名调用方法。
【注】判断一个数是否是整数的代码:if not isinstance(key,(int,long)) ##判断key是不是整数。
2.基本定制
__init__(self,arg1,...)构造器
__new__(self,arg1,...)构造器
__del__(self)解构器
__str__(self)可打印字符的输出,内建str()及print语句
__repr__(self)运行时的字符串输出,内建repr()和操作符
__unicode__(self)内建unicode()
__call__(self,*args)表示可调用的实例
__nonzero__(self)为object定义False值;内建bool
__len__(self)内建len()
class A:
def __init__(self):
print ('call __init__')
def __str__(self):
print ('call __str__')
return 'call __str__'
def __len__(self):
print ('call __len__')
return 1
def __nonzero__(self):
print ('call __nonzero__')
a = A()
print (a)
print (len(a))
【注】__new__和__init__的区别,__new__是创建对象时调用,需要控制一个对象的创建时使用__new__,而__init__创建完对象后调用,对当前的对象就行一些初始化的工作,无返回值,需要控制一个实例初始化。可以这样理解,默认创建是__new__,然后再调用__init__。
【注】__new__的时候,self还不存在;而调用__init__的时候,self已经存在。
3.对象值比较
__cmp__(self,obj)对象比较,内建cmp()
__lt__(self,obj)小于/小于或等于,对应于
__le__(self,obj)
__gt__(self,obj)大于/大于或等于,对应于>或>=
__ge__(self,obj)
__eq__(self,obj)等于/不等于,对应于==或!=
__ne__(self,obj)
class A():
def __init__(self,value=0):
self.value = value
def __lt__(self,obj):
print ('call __lt__')
return self.value < obj.value
def __gt__(self,obj):
print ('call __gt__')
return self.value > obj.value
a1 = A(1)
a2 = A(2)
print (a1
print (a2>a2)
4.属性操作
__getattr__(self,attr)获取属性,内建getattr(),仅当属性没有找到时调用。
__getattribute__(self,attr)获取属性,内建getattr(),总是被调用。
__setattr__(self,attr,val)设置属性
__delattr__(self,atrr)删除属性
__get__(self,attr)(描述符)获取属性
__set__(self,atrr,value)(描述符)设置属性
__delete__(self,attr)(描述符)删除属性
class A():
def __init__(self,value=0):
self.value = value #会调用__setattr__设置value属性
def __getattr__(self,name):
print ('call __getattr__')
try:
return self.__dict__(name)
except:
return 'not found'
def __setattr__(self,name,value):
print ('call __setattr__')
self.__dict__[name] = value
a = A()
print (getattr(a,'value'))
print (getattr(a,'name'))
5.数值及二进制
__*add__(self,obj) +操作符
__*sub__(self,obj) -操作符
__*mul__(self,obj) *操作符
__*div__(self,obj) /操作符
__*truediv__(self,obj) True除,/操作符
__*floordiv__(self,obj) Floor除,//操作符
__*mod__(self,obj) %操作符
__*divmod__(self,obj) 除和去模
__*pow__(self,obj,mod) 乘幂,内建pow,**操作符
__*lshift__(self,obj)左移位,<
__*rshift__(self,obj)右移,>>
__*and__(self,obj)按位与,&
__*or__(self,obj)按位或,|
__*xor__(self,obj)按位异或,^
__neg__(self) 一元负
__pos__(self) 一元正
__abs__(self)绝对值,内建abs()
__invert__(self)按位求反,~
__complex__(self,com)转换为complex,内建complex
__int__(self)转换为int,内建int()
__long__(self)转换为long,内建long()
__float__(self)转为float,内建float()
__oct__(self)八进制,内建oct()
__hex__(self)十六进制,内建hex()
__coerce__(self,num)压缩成同样的数值类型,内建coerce()
__index__(self)压缩可选的数值类型
6.序列
__len__(self)序列中的数目
__getitem(self,index)得到单个序列元素
__setitem__(self,index,value)设置序列中index的元素
__delitem__(self,index)删除单个序列元素
__getslice__(self,index1,index2)得到序列片段
__setslice__(self,index1,index2,value)设置序列片段
__delslice__(self,index1,index2)删除序列片段
__contains__(self,value)测试序列成员,内建in
__*add__(self,obj)串联,+操作符
__*mul__(self,obj)重复,*操作符
__iter__(self,obj)创建迭代器,内建iter
class A():
def __init__(self):
print ('call __init__')
self.value = [1,2,3,4,5,6]
def __len__(self):
print ('call __len__')
return len(self.value)
def __getitem__(self,index):
print ('call __getitem__')
return self.value[index]
def __setitem__(self,index,value):
print ('call __setitem__')
self.value[index] = value
a = A()
print (len(a))
print (a[2])
a[2]= 99
7.映射
__len__(self)mapping中的项的数目
__hash__(self)散列函数值
__getitem__(self,key)得到给定键(key)的值
__setitem__(self,key,value)设定给定键(key)的值
__delitem__(self,key)删除给定键(key)的值
__missing__(self) 给定键如果不在字典中,则提供一个默认值。
7.参考