Python类继承的用法
所谓类的继承,就是新类继承旧类的属性与方法,这种行为称为派生子类(subclassing)。继承的新类称为派生类,被继承的旧类则称为基类。
当用户创建派生类后,就可以在派生类内新增或改写基类的任何方法。
Python 类继承的语法如下:
下面是一个基类 A 与一个基类 B:
下面创建一个 Student 类的派生类:
下面创建一个派生类 Person 的实例变量,并且调用基类 Student 的函数 printData() 打印出数据。
姓名: 张小明
性别: 女
电话: 12345678
下面定义三个类:A、B 和 C。B 继承自 A,C 继承自 B。A、B、C 三个类都有一个相同名称的函数——printName()。
【示例】创建 A、B、C 三个类的实例,并调用 printName() 函数。
这是类A的printName()函数, name = 王小玲
None
这是类B的printName()函数, name = 张一飞
None
这是类C的printName()函数, name = 刘天佑
None
示例中代码分析如下:
当用户创建派生类后,就可以在派生类内新增或改写基类的任何方法。
Python 类继承的语法如下:
class <类名称> [(基类1,基类2, ...)]:
["文件字符串"]
<语句>
在 Python 中,一个派生类可以同时继承自多个基类,基类之间以逗号,隔开。下面是一个基类 A 与一个基类 B:
class A:
pass
class B:
pass
下面是一个派生类 C 继承自一个基类 A:
class C(A):
pass
下面是一个派生类 D 继承自两个基类 A 与 B:
class D(A, B):
pass
1. 派生类的构造方法
下面是一个基类的定义:
class Student:
def __init__(self, name, sex, phone):
self.name = name
self.sex = sex
self.phone = phone
def printData(self):
print ("姓名: ", self.name)
print ("性别: ", self.sex)
print ("电话: ", self.phone)
这个基类 Student 有3个成员变量,即 name(姓名)、sex(性别)及 phone(电话),并且定义了两个函数。
- __init__() 函数:Student 类的构造方法。
- printData() 函数:用来打印成员变量的数据。
下面创建一个 Student 类的派生类:
class Person(Student):
def __init__(self, name, sex, phone): #派生类的构造方法
Student.__init__(self, name, sex, phone) #调用基类的构造方法
派生类的构造方法必须调用基类的构造方法,并使用完整的基类名称。Student.__init__(self,name, sex, phone) 中的 self 参数用来告诉基类现在调用的是哪一个派生类。下面创建一个派生类 Person 的实例变量,并且调用基类 Student 的函数 printData() 打印出数据。
x = Person("张小明", "女", "12345678")
x.printData()
输出结果如下:姓名: 张小明
性别: 女
电话: 12345678
2. 名称空间的搜索顺序
当用户在类内编写函数时,要记得类函数名称空间的搜索顺序是:类的实例→类→基类。下面定义三个类:A、B 和 C。B 继承自 A,C 继承自 B。A、B、C 三个类都有一个相同名称的函数——printName()。
【示例】创建 A、B、C 三个类的实例,并调用 printName() 函数。
class A:
def __init__(self, name):
self.name = name
def printName(self):
print ("这是类A的printName()函数, name = %s" % self.name)
class B(A):
def __init__(self, name):
A.__init__(self, name)
def printName(self):
print ("这是类B的printName()函数, name = %s" % self.name)
class C(B):
def __init__(self, name):
B.__init__(self, name)
def printName(self):
print ("这是类C的printName()函数, name = %s" % self.name)
print(A("王小玲").printName())
print(B("张一飞").printName())
print(C("刘天佑").printName())
输出结果如下:这是类A的printName()函数, name = 王小玲
None
这是类B的printName()函数, name = 张一飞
None
这是类C的printName()函数, name = 刘天佑
None
示例中代码分析如下:
- A("王小玲").printName() 调用 A 类的 printName() 函数。
- B("张一飞").printName() 会先调用 B 类的 printName() 函数,因为已经找到一个 printName() 函数,所以不会继续往 A 类查找。
- ("刘天佑").printName() 会先调用 C 类的 printName() 函数,因为已经找到一个 printName() 函数,所以不会继续往 B 类与 A 类查找。
ICP备案:
公安联网备案: