Python中的魔法方法

来源:互联网 发布:linux io重定向 编辑:程序博客网 时间:2024/04/29 05:46

     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')#实现方案1class SingBird(Bird):    def __init__(self):        Bird.__init__(self) #直接调用未超类绑定的构造方法    def sing(self):        print ('Singing')#实现方案2class SongBird(Bird):    def __init__(self):        super(SongBird,self).__init__() #利用super函数返回超类    def sing(self):        print ('Singing')    bird = SongBird()bird.eat()bird.hungry = Truebird.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.valuea1 = 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] = valuea = 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] = valuea = 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   


原创粉丝点击