9魔法方法,属性和迭代器(上)

9.2构造方法

   构造方法和普通方法的不同之处在于,当一个对象被创建后,会立即调用构造方法。

   

class FooBar:
    def __init__(self):
        self.somevar=42
f=FooBar()
>>>f.somevar
42

9.2.3super函数

   当子类重写了父类的某一方法后,如果想调用父类的这一方法,可以使用super函数。

class Bird:
    def __init__(self):
        self.hungry=True
def eat(self):
    ifself.hungry:
             print(‘Aaaah‘)
classSongBird(Bird):
    def __init__(self):
        super(SongBird,self).__init__()
        self.sound=‘squawk‘
    def sing(self):
        print(self.sound)
>>>sb=SongBird()
>>>sb.sing()
squawk
>>>sb.eat()
Aaaah
 


上例中,首先在重写的构造方法中调用了父类的构造方法,使子类获得hungry属性,然后又加入了自己的sound属性。

9.3成员访问

9.3.1基本的序列和映射规则

序列和映射是对象的集合。为了实现他们基本的行为,如果对象时不可变的,就需要使用两个魔法方法,如果是可变的则需要使用4个。

__len__(self): 返回集合中所有项目的数量。如果是映射,则返回键值对的数量。如果返回0,则会被当作一个布尔变量

__getitem__(self,key)返回与对应的键对应的值,对于一个长度n的序列,键是一个0-n-1的整数

__setitem__(self,key,value):根据一定的方式存储和key对应的value,只能用于可修改对象。

__delitem__(self,key):这个方法对一部分对象使用del语句时被调用

对于一个序列来说,负整数从末尾开始计数,换句话说 x[-n]和x[len(x)-n]是一样的。

9.3.1子类化列表,字典和字符串。

下面例子,带有访问计数的列表

  

  class CounterList(list):
    def __init__(self,*args):
        super(CounterList,self).__init__(*args)
        self.counter=0
    def __getitem__(self,index):
        self.counter+=1
        returnsuper(CounterList,self).__getitem__(index)

在CounterList类中,重写了父类的__init__ 和__getitem__方法, 在构造方法中初始了counter属性,每次列表元素被访问时这个值加一。

cl=CounterList(range(10))
>>> cl
[0, 1, 2, 3, 4, 5,6, 7, 8, 9]
>>>cl[2]+cl[4]
6
>>>cl.counter
2


9.4更多魔力

   略

9.5属性

9.5.1property函数

   

class Rectangle:
    def __init__(self):
        self.width=0
        self.height=0
    def setSize(self,size):
        self.width,self.height=size
    def getSize(self):
        return self.width,self.height
size=property(getSize,setSize)
r=Rectangle()
>>> r.width=10
>>> r.height=5
>>> r.size
(10, 5)
 

9魔法方法,属性和迭代器(上)

上一篇:YUM软件管理


下一篇:XML实体使用