PYTHON_DAY_13_201606011

来源:互联网 发布:airx 知乎 编辑:程序博客网 时间:2024/06/05 10:51
今天来看关于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 # 返回下一个值

0 0