python 物件導向之多型

2022-07-28 03:03:14 字數 3118 閱讀 1049

多型是什麼?

用一句話來概括下,多型就是同一操作(方法)作用於不同的物件時,可以有不同的解釋,產生不同的執行結果。

#

!/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

defwho(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

defwho(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

defwho(self):

return

'i am a teacher, my name is %s

' %self.name

defrun(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,都可以正確列印出結果:

i am a person, my name is

keke

i am a student, my name

iscoke

i am a teacher, my name

is jone

執行結果

這種行為稱為多型。也就是說,方法呼叫將作用在 x 的實際型別上。s 是student型別,它實際上擁有自己的 who()方法以及從 person繼承的 who方法,但呼叫 s.who()總是先查詢它自身的定義,如果沒有定義,則順著繼承鏈向上查詢,直到在某個父類中找到為止。

由於python是動態語言,所以,傳遞給函式 who(x)的引數 x 不一定是 person 或 person 的子型別。任何資料型別的例項都可以,只要它有乙個who()的方法即可。

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

#

!/usr/bin/env python

#-*- coding: utf-8 -*-

#@time : 2017/12/26 0026 15:18

#@author : ming

class

animal:

defrun(self):

print('

animal is running...')

class

dog(animal):

defrun(self):

print('

dog is running...')

class

cat(animal):

defrun(self):

print('

cat is running...')

defrun_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)

view code

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

isrunning...

cat

is running...

執行結果

python物件導向之多型

多型 以封裝和繼承為前提 不同的子類物件呼叫相同的方法 產生不同的執行結果 class dog object def init self,name self.name name def game self print s 開心的玩耍 self.name class gaifei dog 父類的方法不...

物件導向之多型

多型即事物存在的多種形態 要有繼承 要有方法重寫 要有父類引用指向子類物件 1,多型中的成員訪問特點之成員變數 編譯看左邊 父類 執行看左邊 父類 2,多型中的成員訪問特點之成員方法 編譯看左邊 父類 執行看右邊 子類 3,多型中的成員訪問特點之靜態成員方法 編譯看左邊 父類 執行看左邊 父類 總結...

物件導向之多型

多型指的是一類事物有多種形態,多型性是指在不考慮例項型別的情況下使用例項 class animals def run self print running class dog animals def run self print dog is running class pig animals de...