属性和方法查找顺序

多态性(多态绑定)是在有继承背景情况下使用的一种特性.

是指在不考虑实例背景的情况下使用实例

多态的理论根据是属性和方法的查找过程. 只要使用obj.attr的方式使用属性和方法, 则查找顺序一定是: 对象本身, 类定义, 基类定义...

关于先查找对象本身的说明: 因为 python 是一门动态语言, 允许我们在代码执行的过程中去动态的给对象添加属性和方法, 所以先从对象本身查找.


class Father:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("我是父类中的 speak 方法" + self.name)


# Son继承 Father 类
class Son(Father):
    def __init__(self, name, age):
        Father.__init__(self, name)
        self.age = age

    def speak(self):
        Father.speak(self)
        print("我是子类的 speak 方法" + self.name + " 年龄:" + str(self.age))


def foo():
    print("我是动态添加上去的...")


s = Son("李四", 20)
s.speak = foo
s.speak()


鸭子类型

python 的多态有的时候很多人把它称之为鸭子类型

鸭子类型是指: 看起来像鸭子, 叫起来像鸭子, 走起来像鸭子, 那么它既是鸭子, 你就可以把它当鸭子来用.

换成python编程语言的说法就是: 对象属性和方法在使用时和类型是分开的.

class A:
    def speak(self):
        print("a 类中的方法")


class B:
    def speak(self):
        print("b 类中的方法")


def foo(obj):
    obj.speak()


a = A()
b = B()

foo(a)
foo(b)

说明:

  1. foo接受一个对象, 只要这个对象中有speak()方法, 就可以正常执行, 我们并不关注他的类型

  2. A, B这两个类没有任何的关系, 但是他们都有speak方法, 所以传递过去都没有任何的问题.

  3. 这就是鸭子模型, 只要你看起来有speak就可以了


Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-02-25 07:12:09

results matching ""

    No results matching ""