美文网首页
第 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