@property将getter方法变成属性,此时@property本身又创建了@score.setter装饰器,负责将setter方法变为属性赋值,于是可以对score进行属性操作。如果只定义了getter方法,没有定义setter方法,那么就是只读属性。通过@property可以让调用者写出简洁的代码,同时保证了参数的校验。
设计类的继承关系时,通常主线都是单一继承下来的,如果需要加入额外的功能,通过多重继承就可以实现,这种设计称为MixIn,例如:让Dog除了继承Animal,同时继承Runnable,为了更好的看出继承关系,一般将Runnable改为RunnableMixIn:
设计类的时候,我们优先考虑多重继承来组合多个MixIn的功能,可快速构造所需的子类。
python中有许多特殊用途的函数可以帮助我们定制类。
__str__():打印对象时,自定义返回的字符串
>>> class Student(object):
... def __init__(self,name):
... self.name = name
... def __str__(self):
... return 'student object (name:%s)' % self.name
...
>>> print(Student('apple'))
student object (name:apple)
__iter__:如果一个类想用于for...in,类似list或tuple,就需要实现__iter__()方法,该对象返回一个迭代对象,然后for循环会不断调用迭代对象的__next__()方法拿到下一个值,直至遇到StopIteration时退出循环。例如,for循环迭代菲波那切数列:
>>> 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 > 100: # 退出循环的条件 ... raise StopIteration() ... return self.a # 返回下一个值 ... >>> for n in Fib(): ... print(n)
__getitem__:上面Fib()可像list一样用于for循环,如果想像list那样按下标取元素,需要实现__getitem__()方法。与之对应的是__setitem__()方法,把对象视作list来对集合赋值,__delitem__(),用于删除某个元素。
__getattr_:当调用类的方法或属性时,如果不存在会报错。没有找到属性的情况下,会调用__getattr__,该方法可把一个类的所有属性和方法全都动态化处理。例如:
>>> class Student(object): ... def __getattr__(self, attr): ... if attr=='age': ... return 18 ... if attr=='name': ... return lambda:'name' ... >>> stu.name() 'name' >>> stu.age 18
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-70754-13.html
这样我们大家就能好好看着你有一天如同肥猪一样被国家斩杀
有本事联合国让中国说了算在中国办公