天天看點

python 面向對象之多态

多态是什麼?

  用一句話來概括下,多态就是同一操作(方法)作用于不同的對象時,可以有不同的解釋,産生不同的執行結果。

python 面向對象之多态
python 面向對象之多态

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/12/26 0026 15:18
# @Author  : ming
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def who(self):
        return 'I am a Person, my name is %s' % self.name

class Student(Person):
    def __init__(self, name, gender, score):
        super(Student, self).__init__(name, gender)
        self.score = score

    def who(self):
        return 'I am a Student, my name is %s' % self.name

class Teacher(Person):
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course

    def who(self):
        return 'I am a Teacher, my name is %s' % self.name

def run(x):
    print(x.who())

a = Person("keke", "Male")
b = Student("Coke", "Male", 98)
c = Teacher("Jone", "Female", "Chinese")

run(a)
run(b)
run(c)      

View Code

   在一個函數中,如果我們接收一個變量 x,則無論該 x 是 Person、Student還是 Teacher,都可以正确列印出結果:

python 面向對象之多态
python 面向對象之多态
I am a Person, my name is keke
I am a Student, my name is Coke
I am a Teacher, my name is Jone      

運作結果

  這種行為稱為多态。也就是說,方法調用将作用在 x 的實際類型上。s 是Student類型,它實際上擁有自己的 who()方法以及從 Person繼承的 who方法,但調用 s.who()總是先查找它自身的定義,如果沒有定義,則順着繼承鍊向上查找,直到在某個父類中找到為止。

  由于Python是動态語言,是以,傳遞給函數 who(x)的參數 x 不一定是 Person 或 Person 的子類型。任何資料類型的執行個體都可以,隻要它有一個who()的方法即可。

  在繼承關系中,如果一個執行個體的資料類型是某個子類,那它的資料類型也可以被看做是父類。但是,反過來就不行,如下:

python 面向對象之多态
python 面向對象之多态
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/12/26 0026 15:18
# @Author  : ming

class Animal:
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    def run(self):
        print('Dog is running...')

class Cat(Animal):
    def run(self):
        print('Cat is running...')

def run_twice(animal):
    animal.run()
    animal.run()

a = Animal()
d = Dog()
c = Cat()

print('a is Animal?', isinstance(a, Animal))
print('a is Dog?', isinstance(a, Dog))
print('a is Cat?', isinstance(a, Cat))

print('d is Animal?', isinstance(d, Animal))
print('d is Dog?', isinstance(d, Dog))
print('d is Cat?', isinstance(d, Cat))

run_twice(c)      
python 面向對象之多态
python 面向對象之多态
a is Animal? True
a is Dog? False
a is Cat? False
d is Animal? True
d is Dog? True
d is Cat? False
Cat is running...
Cat is running...      

作者:楊永明

出處:https://www.cnblogs.com/ming5218/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。