zoukankan      html  css  js  c++  java
  • 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,就可以创建类,最后创建实例。?完全看不懂

  • 相关阅读:
    vc枚举本机端口信息API
    xmpp 与服务器连接并身份验证成功
    xmpp 常见错误 一
    xmpp 环境配置
    使用宏定义创建单例
    iOS知识列表
    ios sqlite 简单使用
    关于游戏
    开通博客园博客的第一天
    如何让移动设备的宽与浏览器视图的宽保持一致
  • 原文地址:https://www.cnblogs.com/smartwen666/p/7911336.html
Copyright © 2011-2022 走看看