Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python面向对象开发基础篇

 Python面向对象开发基础篇

为视力眼保健操开始!
将Limodou 墙外幻灯迁移可看,,,

Zoom.Quiet

April 06, 2013
Tweet

More Decks by Zoom.Quiet

Other Decks in Technology

Transcript

  1. Window width height background color font draw() fresh() destroy() move()

    resize() 名称 属性 方法 类的组成 • public • private • protect
  2. import os class Command(object): def __init__(self, name): self.name = name

    def __call__(self, *args, **kwargs): raise NotImplementedError class DirCommand(Command): def __call__(self, dir):
  3. • 使用 class 来定义类 • Python 的类可以从父类继承,支持多个父 类 • 类中可以保存属性和方法

    • 属性可以是 descriptor ,通常的数据类型 • 特殊的方法,如:私有方法(开始有两个 下划线),特殊方法(前后各有两个下划 线) • __init__ 为初始化方法,一般不讲构造方 法,不是必须的
  4. • obj = Class(*args, **kwargs) => obj = Class().__init__(*args, **kwargs)

    • obj.attr 可以访问类中定义的属性 • obj.func() 可以调用类中定义的方法 • 属性可以在运行时动态绑定
  5. old style class 和 new style clas s >>> class

    A:pass >>> type(A) <type ‘classobj’> >>> type(int) <type ‘type’> >>> class A1(object):pass >>> type(A1) <type ‘type’>
  6. new style class 的作用 • 在 Python 2.2 之前,类与类型是不统一的 •

    在 Python 2.2 实现了统一 • 让内置的类型子类化更方便 • 提供了属性 (property) 的机制 • 实现了 static 和 class 方法 • 提供了 metaclass 编程 Unifying types and classes in Python 2.2 PEP-252: Making types look more like classes PEP-253: Subtyping built-in types
  7. 类 class A(object):pass class B(A): “””B description””” def out_b(self, name):

    print name class C(A): def out_c(self, name): print name >>> d = D() >>> d.out_b('hello') hello
  8. • 一个类可以有一个或多个基类,多个基类 之间使用’ ,’ 分隔 • 类下可以定义 doc_string • 如果不存在基类,则为一个

    old-style 类 • 只有当所有基类都是 old-style 类时,子类 才是 old-style 类,否则就是 new-style 类 • 如果不需要基类,则可以把 object 作为基 类来创建 new-style 类 • 在 3.x 将不存在 old-style 类,所有的类都 是 new-style ,所以可以省略 object
  9. class C(object): x = 20 def call(self): C.x += 2

    print C.x print self.__class__ C.y = 21 • 在方法中通过 类 变量来使用类属性 • 属性可以动态绑定到类或实例变量上
  10. 类的自省 • isinstance() 判断一个实例是否属性某个类 >>> isinstance(c1, C) True • issubclass()

    判断一个类是否是另一个类的 子类 >>> issubclass(D, D) True >>> issubclass(D, C) True
  11. • dir(D) 可以列出类的属性名,包括方法 • D.__name__ 可以得到类的名称 >>> D.__name__ ‘D’ •

    D.__module__ 得到类所在的模块 • D.__bases__ 得到所有基类 >>> D.__bases__ (<class '__main__.B'>, <class '__main__. C'>)
  12. 如何判断一个对象是类 考虑使用 types ,它定义了许多类型,但是 : >>> import types >>> class

    A:pass >>> isinstance(A, types.ClassType) True >>> isinstance(A, types.TypeType) False >>> import types >>> class B(object):pass >>> isinstance(B, types.ClassType) False >>> isinstance(B, types.TypeType) True
  13. 类私有属性 • 以两个下划线开始的属性, python 会把它 编译为: _classname__attribute • 其实 python

    中不存在真正的私有属性 • 更多是采用约定的方式,如以’ _’ 开始的 >>> class C5(object): ... __private = 23 >>> print C5.__private AttributeError: class A has no attribute ' private' >>> print C5. _C5__private
  14. static 和 class 方法 >>> class A(object): ... @staticmethod ...

    def static(): ... print A.__name__ ... @classmethod ... def method(cls): ... print cls.__name__ >>> a = A()
  15. >>> d = D() >>> isinstance(d, D) True >>> class

    E(object): ... def __init__ (self, n): ... self.x = n >>> e = E(42) • 创建一个实例,只要象写调用一 个函数一样调用类对象。 • 如果类定义了 __init__ 方法,则 创建实例时会把参数传给它来执 行。 • 可以动态向实例绑定新的属性 创建实例
  16. 问题? Python 如何获得一个属 性 class A(object): name = ‘A’ def

    __init__(self, name): self.name = name a = A(‘Hello’) a.name, self.name, A.name 的结果分别是什么?
  17. MRO(Method Resolution Order) • 先查找实例的属性 (self.__dict__) • 再在实例的类中查找 (self.__class__.__dict __)

    • 再到基类中查找 • 如果存在多个基类,根据 mro 的顺序 >>> D.mro() [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>]
  18. __str__, __repr__, __unicode__ • 可让一个对象通过 print 来打印 • print 一个对象时,一般先找

    __str__ ,再 找 __repr__ 。 • 如果在运算中存在 unicode 处理,会尝试 调用 __unicode__ 来进行转換
  19. 什么时候使用面向对象 • 简化代码,实现封装 • 当遇到可以进行抽象的场合,如: GUI 控 件开发 • 在实现可扩展机制的时候,如:配置文件

    读取,实现不同的配置文件格式的解析 • 以类的定义形式来实现某种简化的定义, 如: ORM, Form 等 • 利用类的特殊方法来实现类函数的闭包调 用