#!/usr/bin/python
# Filename: inherit.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 my 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
class
Student
(SchoolMember):
'''Represents a student.'''
def
__init__
(self, name, age, marks):
SchoolMember.__init__(self, name, age)
self.marks = marks
print
'(Initialized Student: %s)'
% self.name
def
tell
(self):
SchoolMember.tell(self)
print
'Marks: "%d"'
% self.marks
t = Teacher(
'Mrs. Shrividya'
,
40
,
30000
)
s = Student(
'Swaroop'
,
22
,
75
)
members = [t, s]
for
member
in
members:
member.tell()
# works for both Teachers and Students
(源檔案:code/inherit.py)
輸出
$ python inherit.py
(Initialized SchoolMember: Mrs. Shrividya)
(Initialized Teacher: Mrs. Shrividya)
(Initialized SchoolMember: Swaroop)
(Initialized Student: Swaroop)
Name:"Mrs. Shrividya" Age:"40" Salary: "30000"
Name:"Swaroop" Age:"22" Marks: "75"
它如何工作
為了使用繼承,我們把基本類的名稱作為一個元組跟在定義類時的類名稱之後。然後,我們注意到基本類的__init__
方法專門使用self
變數調用,這樣我們就可以初始化對象的基本類部分。這一點十分重要——Python不會自動調用基本類的constructor,你得親自專門調用它。
我們還觀察到我們在方法調用之前加上類名稱首碼,然後把self
變數及其他參數傳遞給它。
注意,在我們使用SchoolMember
類的tell
方法的時候,我們把Teacher
和Student
的執行個體僅僅作為SchoolMember
的執行個體。
另外,在這個例子中,我們調用了子類型的tell
方法,而不是SchoolMember
類的tell
方法。可以這樣來理解,Python總是首先尋找對應類型的方法,在這個例子中就是如此。如果它不能在匯出類中找到對應的方法,它才開始到基本類中逐個尋找。基本類是在類定義的時候,在元組之中指明的。
一個術語的注釋——如果在繼承元組中列了一個以上的類,那麼它就被稱作多重繼承。