Python中的魔法方法
2013-11-23 22:13
573 查看
Python中,在名字后面和前面加上双下划线表示魔法方法。如果类实现了这些方法中的某一个,那么Python就会在特殊情况下调用这个函数。这些函数几乎不被用户直接调用。
1.构造方法
Python中__init__()被当作构造方法。同时Python中还有个__del__()的魔法方法,也就是析构方法,它是在对象被垃圾回收回收之前调用。子类的初始化方法一般都要初始化父类的成员,可以通过两种方案完成:一是调用未绑定的超类的构造方法;二是通过super函数调用,调用super函数时需要将当前类和当前类的对象(可命名为self)作为参数,super函数返回超类,然后通过返回的超类调用超类的构造方法。
【注】未绑定的构造方法指直接通过类名调用方法。
【注】判断一个数是否是整数的代码: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()
【注】__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)
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)(描述符)删除属性
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
7.映射
__len__(self)mapping中的项的数目
__hash__(self)散列函数值
__getitem__(self,key)得到给定键(key)的值
__setitem__(self,key,value)设定给定键(key)的值
__delitem__(self,key)删除给定键(key)的值
__missing__(self) 给定键如果不在字典中,则提供一个默认值。
7.参考
http://wenku.it168.com/d_000648004.shtml
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<a2) 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.参考
http://wenku.it168.com/d_000648004.shtml
相关文章推荐
- python进阶之类常用魔法方法和魔法属性
- 17.1 Python入门之魔法方法
- 「python」"魔法"方法
- python中__init__()、__new__()、__call__()、__del__()几个魔法方法的用法
- Python魔法方法(magic method)细解几个常用魔法方法(下)
- Python 魔法方法详解
- python 魔法方法,属性,迭代
- python学习之魔法方法的调用
- Python(8) 魔法方法 `__name__`
- Python的魔法方法 .
- Python中的魔法方法
- Python 魔法方法详解
- python魔法方法
- python 魔法方法
- python的魔法方法之__name__(一)
- python 魔法方法,属性,迭代
- 鱼c笔记——Python魔法方法二:算数运算
- Python 魔法方法详解
- python-魔法方法
- Python类属性访问的魔法方法