(10)python 特殊方法
一、构造方法
在类中定义构造函数
>>> class a: def __init__(self): self.age=42 >>> f=a() >>> f.age 42 >>>
带参数,构造函数
>>> class b: def __init__(self,name): self.name1=name >>> f=b('tom') >>> f.name1 'tom' >>>
重写一般方法
略
重写构造方法
当子类调用父类的方法时,b类重写的构造函数没有name属性,会导致报错
定义两个类 a,b
>>> class a: def __init__(self): self.age=18 def age1(self): print self.age >>> class b(a): def __init__(self): self.name='tom' def name1(self): print self.name
调用a类的age1()方法
>>> f=a() >>> f.age1() 18
没问题
调用b类的name1()方法
>>> n=b() >>> n.name1() tom
没问题
但当调用b类的从a类继承的age1方法时
因为构造方法被重写,b类没有age属性。所以报错了
解决办法:使用super()函数
在子类的构造函数开头加上一行 : super(本类名,self).__init__()
>>> __metaclass__=type #python2.7 新式类才能用super >>> class a: def __init__(self): self.age=18 def age1(self): print self.age >>> class b(a): def __init__(self): super(b,self).__init__() self.name='tom' def name1(self): print self.name >>>
再运行
>>> m=b() >>> m.age1() 18 >>>
得到了想要的结果
二、成员访问
序列和映射规则
类中特殊方法:
__len__ (self)
返回对象中所含项目的数量,对于序列来说是返回元素的个数,对于字典来说返回的是键值对的个数
>>> names=['tom','jack','li'] >>> class Name: def __init__(self,n): self.name=n def __len__(self): return len(self.name) >>> f=Name(names) >>> print len(f) 3 >>>
__getitem__ (self,key)
返回输入键对应的值,对于序列键就是正整数(1,2,3),对于字典键就是key
传序列
>>> letter=['a','b','c'] >>> class Letter: def __init__(self,l): self.dict=l def __getitem__(self,key): return self.dict[key] >>> f=Letter(letter) >>> f[0] 'a' >>> f[1] 'b'
传字典
>>> stu={'1':'tom','2':'jack','3':'li'} >>> class Student: def __init__(self,s): self.dict=s def __getitem__(self,code): return self.dict[code] >>> f=Student(stu) >>> f['2'] 'jack' >>>
__setitem__ (self,key,value)
当获取到值后,可以修改或者新增元素。(像类似保存了元组那样不能被修改的对象,不能使用此方法)
>>> stu={'1':'tom','2':'jack','3':'li'} >>> class Student: def __init__(self,s): self.dict=s def __setitem__(self,code,name): self.dict[code]=name def __getitem__(self,code): return self.dict[code] >>> f=Student(stu) >>> stu {'1': 'tom', '3': 'li', '2': 'jack'} >>> f['4']='hanmeimei' >>> stu {'1': 'tom', '3': 'li', '2': 'jack', '4': 'hanmeimei'} >>>
__delitem__(self,key)
此方法在对对象使用del时被调用,同时会删除键和值。
拿上面的例子加个__delitem__(self,key)方法
>>> stu={'1':'tom','2':'jack','3':'li'} >>> class Student: def __init__(self,s): self.dict=s def __getitem__(self,code): return self.dict[code] def __delitem__(self,code): del self.dict[code] >>> f=Student(stu) >>> stu {'1': 'tom', '3': 'li', '2': 'jack'} >>> f['2'] 'jack' >>> del f['2'] >>> stu {'1': 'tom', '3': 'li'} >>>
如果不写__delitem__(self,key)试图删一个元素,会报错
三、属性
1、 property
通过访问器定义的特性称为属性
s=property(a,b,c,d)
s称为属性,a,b,c,d是property()方法的参数。
a,b,c是方法,d是文档字符串。 c,d是可选参数。
当获取s属性里的值时,会调用a方法。当给s属性赋值时,会调用b方法。删除s属性调用c方法。
调用property方法前提是要使用新式类
2、装饰器
?
3、__getattr__,__setattr__
?
四、迭代器
五、生成器
六、八皇后问题
python 执行顺序
从上往下顺序执行,定义的方法和类要写在调用之前,
如果有 if __name__ == '__main__' 改方法所在的文件作为启动文件时会被调用,如果作为模块被调用时不会被执行。