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)