Python 基礎 類的繼承

2022-05-05 20:57:07 字數 4472 閱讀 3366

如果寂靜定義了person類,需要定義新的student 和teacher 類時

可以直接從person 中繼承

class person(object):

def __init__(self,name,gender):

self.name = name

self.gender = gender

定義 student 類時,只需要把額外的屬性加上,例如:score

class student(person):

def __init__(self,name,gender,score):

super(student,self).__init__(name,gender)

self.score = score

一定要用 super(student, self).__init__(name, gender) 

去初始化父類,否則,繼承自 person 的 student 將沒

有 name 和 gender。

函式super(student, self)將返回當前類繼承的父類,

即 person ,然後呼叫__init__()方法,注意self引數已在

super()中傳入,在__init__()中將隱式傳遞,不需要寫出(也不能寫)。

python 中判斷型別

函式isinstance() 可以判斷乙個變數的型別,既可以用函式內建的資料型別如str,

list, dict,也可以用在我們自定義的型別,它們本質上資料型別。

假如有如下的 person, student 和 teacher 的定義及繼承關係。

class person(object):

def __init__(self, name, gender):

self.name = name

self.gender = gender

class student(person):

def __init__(self, name, gender, score):

super(student, self).__init__(name, gender)

self.score = score

class teacher(person):

def __init__(self, name, gender, course):

super(teacher, self).__init__(name, gender)

self.course = course

p = person('tim', 'male')

s = student('bob', 'male', 88)

t = teacher('alice', 'female', 'english')

當我們拿到變數 p、s、t 時,可以使用 isinstance 判斷型別:

isinstance(p, person)

true # p是person型別

isinstance(p, student)

false # p不是student型別

我們再考察 s :

isinstance(s, person)

true # s是person型別

isinstance(s, student)

# s是student型別

isinstance(s, teacher)

false # s不是teacher型別

s 是student型別,不是teacher型別,這很容易理解。但是,s 也是

person型別,因為student繼承自person,雖然它比person多了一些

屬性和方法,但是,把 s 看成person的例項也是可以的。

這說明在一條繼承鏈上,乙個例項可以看成它本身的型別,

也可以看成它父類的型別。

python 中多型

類具有繼承關係,並且子類型別可以向上轉型看做符型別,如果我們從person

派生出 student 和teacher, 並都寫了乙個who aml() 方法

class person(object):

def __init__(self, name, gender):

self.name = name

self.gender = gender

def whoami(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 whoami(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 whoami(self):

return 'i am a teacher, my name is %s' % self.name

在乙個函式中,如果我們接收乙個變數 x,則無論該 x 是 person、student還

是 teacher,都可以正確列印出結果:

def who_am_i(x):

print x.whoami() p = person('tim', 'male')

s = student('bob', 'male', 88)

t = teacher('alice', 'female', 'english')

who_am_i(p) who_am_i(s) who_am_i(t)

執行結果:

i am a person, my name is tim i am a student, my name is bob i am a teacher, my name is alice    

這種行為稱為多型。也就是說,方法呼叫將作用在 x 的實際型別上。s 是

student型別,它實際上擁有自己的 whoami()方法以及從 person繼承的

whoami方法,但呼叫 s.whoami()總是先查詢它自身的定義,如果沒有定

義,則順著繼承鏈向上查詢,直到在某個父類中找到為止。

python 中多重繼承

除了從乙個父類繼承外,python允許從多個父類繼承,稱為多重繼承。

多重繼承的繼承鏈就不是一棵樹了,它像這樣:

class a(object):

def __init__(self, a):

print 'init a...' self.a = a

class b(a):

def __init__(self, a):

super(b, self).__init__(a) print 'init b...'

class c(a):

def __init__(self, a):

super(c, self).__init__(a) print 'init c...'

class d(b, c):

def __init__(self, a):

super(d, self).__init__(a) print 'init d...'

像這樣,d 同時繼承自 b 和 c,也就是 d 擁有了 a、b、c 的全部功能。多重繼

承通過 super()呼叫__init__()方法時,a 雖然被繼承了兩次,但__init__()只

呼叫一次:

d = d('d')

init a...

init c...

init b...

init d...

多重繼承的目的是從兩種繼承樹中分別選擇並繼承出子類,以便組合功能使用。

python 中獲取物件資訊

除了用 isinstance() 判斷它是否是某種型別的例項外,還有沒有別的方法獲取到更多的資訊呢?

class person(object):

def __init__(self, name, gender):

self.name = name self.gender = gender

class student(person):

def __init__(self, name, gender, score):

super(student, self).__init__(name, gender)

self.score = score def whoami(self):

return 'i am a student, my name is %s' % self.name

首先可以用 type() 函式獲取變數的型別,它返回乙個 type 物件:

type(123)

python 類 繼承 python 類的繼承

1 所用的類都可以被繼承 2 沒有繼承其他類的類必然有乙個父類 object 3子類可以擁有父類的 init 裡的類容 派生子類除了父類的一些屬性,還會有自己的屬性和方法,這些就叫派生 如何使用 實現 class animal def init self,name,attack,hp self.na...

Python基礎類與繼承學習

類 class cocacola formula caffeine sugar water soda def drink self print energy coke cocacola coke.drink print n self class coca formula caffeine sugar...

Python 類的繼承

有兩個模組 file1.py 和 file2.py file2中有個基類base def abc self return function abc and name self class base object def init self,name self.name name defrun sel...