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,就可以创建类,最后创建实例。?完全看不懂

posted @ 2017-11-28 18:05  smartwen  阅读(210)  评论(0编辑  收藏  举报