标签:
既能检查参数,又可以用类似属性这样简单的方式来访问类的变量,可以让调用者写出简短的代码
class Student(object): #birth是可读写属性(多定义了一个setter的装饰器),而age就是一个只读属性 @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value @property def age(self): return 2014 - self._birth --------------------------------- >>>s = Student() >>>s.birth = 2000 >>>s.birth 2000 >>>s.age
【1】python中如果子类有自己的构造函数,不会自动调用父类的构造函数,如果需要用到父类的构造函数,则需要在子类的构造函数中显式的调用。
【2】如果子类没有自己的构造函数,则会直接从父类继承构造函数,这在单继承(一个子类只从一个父类派生)中没有任何理解上的问题。
问题:如果是多继承的情况,一个子类从多个父类派生,而子类又没有自己的构造函数,则子类默认会继承哪个父类的构造函数。
【3】子类从多个父类派生,而子类又没有自己的构造函数时,
(1)按顺序继承,哪个父类在最前面且它又有自己的构造函数,就继承它的构造函数;
(2)如果最前面第一个父类没有构造函数,则继承第2个的构造函数,第2个没有的话,再往后找,以此类推。
https://docs.python.org/2/reference/datamodel.html#special-method-names
1. __str__、 __repr__
class Student(object): def __init__(self, name): self.name = name def __str__(self): return ‘Student object (name=%s)‘ % self.name __repr__ = __str__ >>>print Student(‘David‘) >>>Student(‘David‘) ---------------- Student object (name=David) #__str__ Student object (name=David) #__repr__
2 __getattr__
class Student(object): def __init__(self, name): self.name = ‘Michael‘ def __getattr__(self, attr): if attr==‘score‘: return 99 >>>student = Student(‘David‘) >>>student.name >>>student.score >>>print student.grade --------------- ‘David‘ 99 None #可以让class只响应特定的几个属性(通过抛出AttributeError的错误)
3 __iter__
如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
class Fib(object): def __init__(self): self.a, self.b = 0, 1 # 初始化两个计数器a,b def __iter__(self): return self # 实例本身就是迭代对象,故返回自己 def next(self): self.a, self.b = self.b, self.a + self.b # 计算下一个值 if self.a > 1000: # 退出循环的条件 raise StopIteration(); return self.a # 返回下一个值 >>> for n in Fib(): ... print n, ------------------------ 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
4 __getitem__
class Fib(object): def __getitem__(self, n): a, b = 1, 1 for x in range(n): a, b = b, a + b return a ------------------------- >>> f = Fib() >>> f[0] 1 >>> f[1] 1 >>> f[2] 2 >>> f[10] 89 >>> f[100] 573147844013817084101
5 __call__
而且通过callable()函数,我们就可以判断一个对象是否是“可调用”对象
class Student(object): def __init__(self, name): self.name = name def __call__(self): print(‘My name is %s.‘ % self.name) >>>student = Student(‘Daivd‘) >>>student() --------------------- My name is David.
2015-05-09
标签:
原文地址:http://www.cnblogs.com/whuyt/p/4491409.html