今天来看关于OOP的高级编程
Software Development Kit = SDK = 软件开发工具包
#数据封装、继承和多态只是OOP中最基础的三个概念,其他还有多重继承、定制类、元类等概念
#Python作为动态语言,你可以在给instance绑定属性,也可以直接给class绑定属性。
from types import MethodType
instance.new_function = MethodType(new_function, instance, class)#给实例创建新的方法
class.new_function = MethodType(new_function, None, class)#直接给类创建新的方法,之后所有该类的实例都可以使用新方法
#当创建一个class时,会从object中继承一个__slots__变量。
class new(object):
__slots__ = ('name', 'job')
#此时,从new这个类建立的实例就只能存在name和job这两个属性名称。
#但是并不影响从new继承下去的子类。
#也不影响对new类而不是其实例,直接建立新属性。
#为了防止对instance中属性的任意修改,需要在类中定义一些方法来限制属性的范围。此时需要用到内置的@property装饰器来进行更方便的操作,它可以把一个方法变成属性调用!
class Student(object):
@property#定义如何得到属性
def birth(self):
return self._birth
@birth.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
@property#值定义如何得到属性而不定义如何设置的话,这个方法就是一个只读属性
def age(self):
return 2014 - self._birth
#对于多重继承,除了主线继承下来的类,其他类通常被称之为Mixin,例如AudibleMixin,VisibleMixin。
#class内有很多特殊用途的函数,帮助我们定制类。
class newClass(object):
def __str__(self):
return 'something'
__repr__ = __str__
#定义__str__可以帮助我们打印实例时,回复我们想要看到的文字
>>> print newClass()
something
>>> newClass()#定义了43行,就会有这样的作用。
something
#在类中实现__iter__()方法就可以让类被适用于for... in class的循环,该方法返回一个迭代对象,然后,for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值。
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化两个计数器a,b,注意,这里的计数器变量是函数内的变量,不能用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 # 返回下一个值