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 类查找。