Python 面向对象之高级编程
7.面向对象高级编程
7.1使用__slots__
python动态语言,new 对象后绑定属性和方法
Tip:给一个实例绑定的方法,对其他对象无效。可以通过对class绑定后,所有对象可以调用该方法
如果我们现在只有实例可以添加属性,使用__slots__,只允许对Student实例添加name和age属性,
添加其他属性报错
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
该限定只对当前对象起作用,其子类不做限定
-----------
7.2 @property 简短的代码又可检查参数得正确性
class Student(object):
def get_score(self):
return self._score
def set_score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
--------------------
class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
#。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了
另一个装饰器@score.setter, 负责把一个setter方法变成属性赋值
------------------
7.3多重继承
类的继承问题http://python.jobbole.com/85685/
class Dog(Mammal, RunnableMixIn, CarnivorousMixIn):
pass
---------
7.4 定制类
__iter__
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 > 100000: # 退出循环的条件
raise StopIteration()
return self.a # 返回下一个值
for n in Fib()
print(n)
----------
7.5 枚举类
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。
-----------------
7.6使用元类
type() ;
#动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。
先定义metaclass,就可以创建类,最后创建实例。?完全看不懂