Python类的特殊方法

Python 类可以定义专用方法,专用方法是在特殊情况下或当使用特别语法时由 Python 替你调用的,而不是在代码中直接调用(象普通的方法那样)。

.1    __init__
 类似于构造函数
 #!/usr/local/bin/python
 class Study:
         def __init__(self,name=None):
                  = name
         def say(self):
                 print 
 study = Study("Badboy")
 study.say()

.2    __del__
 类似于析构函数
 #!/usr/local/bin/python
 class Study:
         def __init__(self,name=None):
                  = name
         def __del__(self):
                 print "Iamaway,baby!"
         def say(self):
                 print 
 study = Study("zhuzhengjun")
 study.say()

.3__repr__
 使用repr(obj)的时候,会自动调用__repr__函数,该函数返回对象字符串表达式,
 用于重建对象,如果eval(repr(obj))会得到一个对象的拷贝。
 #!/usr/local/bin/python
 class Study:
         def __init__(self,name=None):
                  = name
         def __del__(self):
                 print "Iamaway,baby!"
         def say(self):
                 print 
         def __repr__(self):
                 return "Study('jacky')"
 study = Study("zhuzhengjun")
 study.say()
 print type(repr(Study("zhuzhengjun"))) # str
 print type(eval(repr(Study("zhuzhengjun")))) # instance

 study = eval(repr(Study("zhuzhengjun")))

 study.say()

.4__str__
 Python能用print语句输出内建数据类型。有时,程序员希望定义一个类,要求它的对象也能用print语句输出。Python类可定义特殊方法__str__,为类的对象提供一个不正式的字符串表示。如果类的客户程序包含以下语句:

 print objectOfClass
 那么Python会调用对象的__str__方法,并输出那个方法所返回的字符串。

 #!/usr/local/bin/python

 class PhoneNumber:
         def __init__(self,number):
                  self.areaCode=number[1:4]
                  self.exchange=number[6:9]
                  self.line=number[10:14]

         def __str__(self):
                 return "(%s) %s-%s"%(self.areaCode,self.exchange,self.line)

 def test():
          newNumber=raw_input("Enter phone number in the form. (123) 456-7890: \n")
          phone=PhoneNumber(newNumber)
          print "The phone number is:"
          print phone

 if__name__=="__main__":
          test()
          
 方法__init__接收一个形如"(xxx) xxx-xxxx"的字符串。字符串中的每个x都是电话号码的一个位数。方法对字符串进行分解,并将电话号码的不同部分作为属性存储。

 方法__str__是一个特殊方法,它构造并返回PhoneNumber类的一个对象的字符串表示。解析器一旦遇到如下语句:
 print phone

 就会执行以下语句:

 print phone.__str__()

 程序如果将PhoneNumber对象传给内建函数str(如str(phone)),或者为PhoneNumber对象使用字符串格式化运算符%(例如"%s"%phone),Python也会调用__str__方法。

.5__cmp __
 比较运算符,0:等于 1:大于 -1:小于
 class Study:  
      def __cmp__(self, other):  
          if other > 0 :  
              return 1  
          elif other < 0:  
              return - 1  
          else:  
              return 0  
    
 study = Study()  
 if study > -10:print 'ok1'  
 if study < -10:print 'ok2'  
 if study == 0:print 'ok3' 

 打印:ok2 ok3
 说明:在对类进行比较时,python自动调用__cmp__方法,如-10 < 0 返回 -1,也就是说study 应该小与 -10,估打印ok2
.6__getitem__
 __getitem__ 专用方法很简单。象普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值。
 class Zoo:  
      def __getitem__(self, key):  
          if key == 'dog':return 'dog'  
          elif key == 'pig':return  'pig'  
          elif key == 'wolf':return 'wolf'  
          else:return 'unknown'  
    
 zoo = Zoo()  
 print zoo['dog']  
 print zoo['pig']  
 print zoo['wolf']

 打印 dog pig wolf

.7__setitem__
 __setitem__ 简单地重定向到真正的字典 self.data ,让它来进行工作。  
 class Zoo:  
      def __setitem__(self, key, value):  
          print 'key=%s,value=%s' % (key, value)  
    
 zoo = Zoo()  
 zoo['a'] = 'a'  
 zoo['b'] = 'b'  
 zoo['c'] = 'c'
 打印:
 key=a,value=a
 key=b,value=b
 key=c,value=c
.8 __delitem__
 __delitem__ 在调用 del instance[key] 时调用 ,你可能记得它作为从字典中删除单个元素的方法。当你在类实例中使用 del 时,Python 替你调用 __delitem__ 专用方法。
 class A:  
      def __delitem__(self, key):  
          print 'delete item:%s' %key  
    
 a = A()  
 del a['key']


运算符重载

和c++一样,Python也可以对运算符进行重载。可以重载的方法如下表所示。

Method

Overloads

Call for

init

构造函数

X=Class()

del

析构函数

对象销毁

repr

打印转换

print X,repr(X)

str

打印转换

print X,str(X)

call

调用函数

X()

getattr

限制

X.undefine

setattr

取值

X.any=value

getitem

索引

X[key],For If

setitem

索引

X[key]=value

len

长度

len(X)

iter

迭代

For In

add

+

X+Y,X+=Y

sub

-

X-Y,X-=Y

mul


XY

radd

右加+

+X

iadd

+=

X+=Y

or

|

X|Y,X|=Y

cmp

比较 ==

X==Y,X

lt

小于<

X

eq

等于=

X=Y

class Number(object):
def __init__(self, value):
self.value = value
# 加重载
def __add__(self, other):
return Number(self.value + other.value)
# 打印重载
def __str__(self):
return 'The value is %d.' % self.value
# 比较重载
def __cmp__(self, other):
return cmp(self.value, other.value)
>>> x = Number(1)
>>> y = Number(2)
>>> print x + y
The value is 3.
>>> x > y
False
>>> x < y
True

参考文献:

http://5ydycm.blog.51cto.com/115934/157548

http:///2013/05/python-class/