如果寂靜定義了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...