Imooc - Python3 进阶教程: Python类的继承

本章讲解Python类的继承,如何判断实例类型,多态以及如何获取对象信息。
更新于: 2022-01-13 02:39:37

Student 继承自 Person 的实现

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
        
class Student(Person):
    def __init__(self, name, gender, score):
        super(Student, self).__init__(name, gender)
        self.score = score

student = Student('Alice', 'girl', 100)
print(student.name) # ==> Alice
print(student.gender) # ==> girl
print(student.score) # ==> 100

调用父类的构造方法

从调用父类构造方法的角度,就有点挫了。

但看了下面的多继承,就明白这里的用法了。

super(Student, self).__init__(name, gender)

类型判断

>>> isinstance(s, Person)
True # s是Person类型
>>> isinstance(s, Student)
True # s是Student类型
>>> isinstance(s, Teacher)
False # s不是Teacher类型

也可以判断自有数据类型

​s = 'this is a string.'
n = 10
isinstance(s, int) # ==> False
isinstance(n, str) # ==> False

多重继承

多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用
举个例子,Python的网络服务器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服务器运行模式有 多进程ForkingMixin 和 多线程ThreadingMixin两种。

class A(object):
    def __init__(self, a):
        print ('init A...')
        self.a = a

class B(A):
    def __init__(self, a):
        super(B, self).__init__(a)
        print ('init B...')

class C(A):
    def __init__(self, a):
        super(C, self).__init__(a)
        print ('init C...')

class D(B, C):
    def __init__(self, a):
        super(D, self).__init__(a)
        print ('init D...')

获取对象的方法

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

p = Person("Alice", "Female")

# 获取类型
type(p)
# 获取里面的成员
dir(p)
# 获取/设置属性
getattr(p, 'name') # 获取name属性
setattr(p, 'name', 'Adam') # 设置新的name属性