#!/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)
print # prints a blank line
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"
它如何工作
為了使用繼承,我們把基本類的名稱作為一個(gè)元組跟在定義類時(shí)的類名稱之后。然后,我們注意到基本類的 init 方法專門使用 self 變量調(diào)用,這樣我們就可以初始化對(duì)象的基本類部分。這一點(diǎn)十分重要——Python 不會(huì)自動(dòng)調(diào)用基本類的 constructor,你得親自專門調(diào)用它。
我們還觀察到我們?cè)诜椒ㄕ{(diào)用之前加上類名稱前綴,然后把 self 變量及其他參數(shù)傳遞給它。
注意,在我們使用 SchoolMember 類的 tell 方法的時(shí)候,我們把 Teacher 和 Student 的實(shí)例僅僅作為 SchoolMember 的實(shí)例。
另外,在這個(gè)例子中,我們調(diào)用了子類型的 tell 方法,而不是 SchoolMember 類的 tell 方法??梢赃@樣來理解,Python 總是首先查找對(duì)應(yīng)類型的方法,在這個(gè)例子中就是如此。如果它不能在導(dǎo)出類中找到對(duì)應(yīng)的方法,它才開始到基本類中逐個(gè)查找。基本類是在類定義的時(shí)候,在元組之中指明的。
一個(gè)術(shù)語的注釋——如果在繼承元組中列了一個(gè)以上的類,那么它就被稱作 多重繼承 。