Python高階筆記(5) 繼承

2021-07-16 03:51:07 字數 3368 閱讀 5926

類的繼承指的是在已有的類上增加新的類。比如,假設你想要寫乙個程式來記錄學校之中的教師和學生情況。他們有一些共同屬性,比如姓名、年齡和位址。他們也有專有的屬性,比如教師的薪水、課程和假期,學生的學號和成績。也就是說姓名、年齡和位址為共同的類,而薪水、課程為教師獨有的類,學號和成績為學生獨有的類。那麼就可以先建立乙個共同的類schoolmember,包含姓名、年齡和位址屬性,然後為老師建立乙個 teacher 類,包含薪水、課程等屬性,為學生建立乙個 student 類,包含學號和成績等屬性。teacher 和 student 都是從 schoolmember 中繼承出來的,這樣二者也就包含了 姓名、年齡和位址等屬性。

具體可以先看看下例:

# filename : inherit_test.py

class schoolmember:

'''represents any school member.'''

def __init__(self, name, age):

self.name = name

self.age = age

print '(initialized schoolmember:%s)' %self.name

def tell(self):

'''tell the details.'''

print 'name:"%s", age:"%s"' %(self.name, self.age)

class teacher(schoolmember):

'''represents a teacher'''

def __init__(self, name, age, salary):

schoolmember.__init__(self,name,age)

self.salary = salary

print '(initialized teacher: %s)' %self.name

def tell(self):

schoolmember.tell(self)

print 'salary: "%d"' %self.salary

print # prints a blank line

class student(schoolmember):

'''represents a student'''

def __init__(self, name, age, marks, score):

schoolmember.__init__(self,name,age)

self.marks = marks

self.score = score

print '(initialized student: %s)' %self.name

def tell(self):

schoolmember.tell(self)

print 'marks:"%d", score:"%d"' %(self.marks,self.score)

teachers = teacher('pro. phoenix', 33, 50000)

students = student('tree', 23, 2120130992, 98)

print # prints a blank line

members = [teachers, students]

for member in members:

member.tell()

輸出為

這裡,我們繼承的書寫方式是 

schoolmember.__init__(self,name,age)
還有一種方式是

super(teacher, self).__init__(name, gender)
判斷型別

可以通過 函式isinstance()可以判斷乙個變數的型別,既可以用在python內建的資料型別如str、list、dict,也可以用在我們自定義的類,它們本質上都是資料型別。

例如我們對上例的基礎上再做如下判斷:

peopple  = schoolmember('someone',30)

print isinstance(peopple,schoolmember)

print isinstance(peopple,teacher)

print isinstance(peopple,student)

print isinstance(teachers,schoolmember)

print isinstance(teachers,teacher)

print isinstance(teachers,student)

print isinstance(teachers, object)

輸出為

true

false

false

true

true

false

true

多型和多重繼承

第乙個例子中,有乙個 tell()在父類和子類裡都出現了。這種表達稱為多型。乙個子型別在任何需要父型別的場合可以被替換成父型別,即物件可以被視作是父類的例項,這種現象被稱為多型現象。

class person(object):

pass

class student(person):

pass

class teacher(person):

pass

class skillmixin(object):

pass

class basketballmixin(skillmixin):

def skill(self):

return 'basketball'

class footballmixin(skillmixin):

def skill(self):

return 'football'

class bstudent(student, basketballmixin):

pass

class fteacher(teacher, footballmixin):

pass

s = bstudent()

print s.skill()

t = fteacher()

print t.skill()

上例多重繼承可以用下圖表示

繼承(學習筆記) 《高階教程》

先不管上圖,先來看以下 function person person.prototype.saypersonname function function student student.prototype new person student 的原型物件替換為 person 的例項物件 參考上圖中右...

繼承(學習筆記) 《高階教程》

先不管上圖,先來看以下 function person person.prototype.saypersonname function function student student.prototype new person student 的原型物件替換為 person 的例項物件 參考上圖中右...

C 高階 七 繼承與派生5

派生類的構造和析構 c 11規定 語法形式 派生類名 派生類名 基類所需的形參,本類成員所需的形參 基類名 參數列 本類成員初始化列表 includeusing namespace std class b b b b b int i b b void b print const class c pu...