美文网首页
第 25 章 OOP:宏伟蓝图

第 25 章 OOP:宏伟蓝图

作者: 南北东西总相随 | 来源:发表于2017-10-01 11:10 被阅读0次

    第 25 章 OOP:宏伟蓝图

    为何使用类

    类是 Python 的程序组成单元,就像函数和模块一样:类是封装逻辑和数据的另一种方式。

    类也定义新的命名空间,在很大程度上就像模块。

    和其他程序组成单元相比,类有三个重要的独到之处,使其在建立新对象时更为有用。

    • 多重实例:每次调用一个类,就会产生一个有独立命名空间的新对象。

    • 通过继承进行定制:类可以建立命名空间的层次结构。

    • 运算符重载:通过提供特定的协议方法,类可以定义对象来响应在内置类型上的几种运算。

    概览 OOP

    属性继承搜索

    找出 attribute 首次出现的地方,先搜索 object,然后是该对象之上的所有类,由下至上,由左至右。

    object.attribute
    

    继承搜索树

    每次使用 object.attribute 表达式时,Python 会在运行期间去“爬树”,来搜索属性。树中位置较高的类称为超类(superclass),位置较低的类则称为子类(subclass)。超类提供了所有子类共享的行为,但是因为搜索是由下而上,子类可能会在树中较低位置重新定义超类的变量名,从而覆盖超类定义的行为。

    类和实例

    在 Python 对象模型中,类和通过类产生的实例是两种不同的对象类型。

    • 类:类是实例工厂。类的属性提供了行为(数据以及函数),所有从类产生的实例都继承该类的属性。
    • 实例:代表程序领域中具体的元素。实例属性记录数据,而每个特定对象的数据都不同。

    类和模块的另一个差异:内存中特定模块只有一个实例(所以我们得重载模块以取得其新代码),但是,对类而言,只要有需要,制作多少实例都可以。

    类方法调用

    每当我们调用附属于类的函数时,总会隐含着这个类的实例。Python 会把隐含的实例传进方法中的第一个特殊参数,习惯上将其称为 self

    编写类树

    • 每个 class 语句会生成一个新的类对象。

    • 每次调用类时,就会生成一个新的实例对象。

    • 实例自动连接至创建了这些实例的类。

    • 类连接至其超类的方式是,将超类列在类头部的括号内。其从左至右的顺序会决定树中的次序。

    class C2: ...                      # Make class objects (ovals)
    class C3: ...
    class C1(C2, C3): ...              # Linked to superclasses
    
    I1 = C1()                          # Make instance objects (rectangles)
    I2 = C1()                          # Linked to their classes
    

    属性通常是在类内,对传给函数的特殊参数(也就是 self),做赋值运算而添加在实例中的。

    class C1(C2, C3):
        def __init__(self, who):     # Set name when constructed
            self.name = who          # Self is either I1 or I2
    
    I1 = C1('bob')                   # Sets I1.name to ‘bob’
    I2 = C1('mel')                   # Sets I2.name to ‘mel’
    print(I1.name)                   # Prints ‘bob’
    

    附加在实例上的属性只属于那些实例,但附加在类上的属性则由所有子类及其实例共享。

    OOP 是为了代码重用

    类其实就是由函数和变量名所构成的包,很像模块。

    相关文章

      网友评论

          本文标题:第 25 章 OOP:宏伟蓝图

          本文链接:https://www.haomeiwen.com/subject/qsgoextx.html