继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。

继承

1
2
class 子类(父类):
    pass

任何类都可以直接或间接的继承自object类。object类是一切类的超类。默认是继承object类。

1
2
class Animal(object):
    pass

1
2
class Animal:
    pass

是一样的。都是继承自object类。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
class Animal:
    #类属性
    name = "Animal"
    #父类中的方法
    def run(self):
        print('Animal is running...')


#定义子类Dog,继承自Animal
class Dog(Animal):
    #子类中的方法
    def wanwan(self):
        print('Dog is wanwan...')

d = Dog()
d.run()        # 调用继承的Animal类的方法
d.wanwan()     # 调用本身的方法
print(d.name)  # 打印继承的类属性
a = Animal()
print(a.name)  # 打印类属性

执行以上程序会输出如下结果:

1
2
3
4
Animal is running...
Dog is wanwan...
Animal
Animal

base属性

此属性用来记录类的父类。

1
2
3
4
5
6
7
8
9
class Animal:
    pass

class Dog(Animal):
    pass

print(Animal.__base__)        # 打印Animal的父类
print(Dog.__base__)           # 打印Dog的父类
print(Dog.__base__.__base__)  # 打印Dog的父类的父类,也就是Animal的父类

结果是

1
2
3
<class 'object'>
<class '__main__.Animal'>
<class 'object'>

bases

此属性用来记录类对象的基类的元组。

1
2
3
4
5
6
7
8
class Animal:
    pass

class Dog(Animal):
    pass

print(Animal.__bases__)  # 打印Animal父类的元组
print(Dog.__bases__)     # 打印Dog的父类的元组

结果是

1
2
(<class 'object'>,)
(<class '__main__.Animal'>,)

构造函数init()的继承

python默认子类是不继承父类的构造函数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Animal:
    def __init__(self,name):
        self.name = name
        print("Animal对象初始化完成")

class Dog(Animal):
    def __init__(self,name):
        self.name = name
        print("Dog对象初始化完成")

d = Dog("Dog")

执行以上程序会输出如下结果:
Dog对象初始化完成

继承父类构造函数,必须显式声明。有两种写法(推荐2)。

  1. 父类名称.__init__(self,参数1,参数2,…)
  2. super().__init__(参数1,参数2,….)

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    class Animal:
    def __init__(self,name):
        self.name = name
        print("Animal对象初始化完成")
    
    class Dog(Animal):
    def __init__(self,name):
        print("Dog对象初始化开始")
        Animal.__init__(self,"Animal") #相当于super().__init__("Animal")
        self.name = name
        print("Dog对象初始化完成")
    
    a = Animal("Animal")
    d = Dog("Dog")

执行以上程序会输出如下结果:

1
2
3
4
Animal对象初始化完成
Dog对象初始化开始
Animal对象初始化完成
Dog对象初始化完成

覆盖:override

是指在有继承派生关系的类中,子类中实现了与基类(超类)同名的方法,在子类实例调用方法时,实际调用的是子类中的覆盖版本,这种现象叫做覆盖。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Animal:
    def __init__(self,name):
        self.name = name
        print("Animal对象初始化完成")

    #父类中的方法
    def run(self):
        print('Animal is running...')

#定义子类Dog,继承自Animal
class Dog(Animal):
    def __init__(self,name):
        print("Dog对象初始化开始")
        Animal.__init__(self,"Animal") #相当于super().__init__("Animal")
        self.name = name
        print("Dog对象初始化完成")

    #子类中的方法
    def wanwan(self):
        print('Dog is wanwan...')

    #子类 重构方法
    def run(self):
        print('Dog is running...')

a = Animal("Animal")
d = Dog("Dog")
a.run()
d.run()

执行以上程序会输出如下结果:

1
2
3
4
5
6
Animal对象初始化完成
Dog对象初始化开始
Animal对象初始化完成
Dog对象初始化完成
Animal is running...
Dog is running...

类属性修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Animal:
    #父类属性age
    age = 0

    #父类属性name
    name = "Animal"

#定义子类Dog,继承自Animal
class Dog(Animal):
    #覆盖父类的属性name
    name = "Dog"

a = Animal()
d = Dog()

print(a.age)  # 打印Animal的类属性
print(d.age)  # 打印继承自父类的属性

print(a.name)  # 打印Animal的类属性
print(d.name)  # 打印Dog类覆盖的属性

Animal.age = 100  # 父类age属性重新赋值
print(a.age)      # 重新复制后,打印Animal的类属性
print(d.age)      # 重新复制后,打印Dog类属性

Animal.name = "Animal's name"  # 父类name属性重新赋值
print(a.name)  # 重新复制后,打印Animal的类属性
print(d.name)  # 重新复制后,打印Dog类覆盖的属性

执行以上程序会输出如下结果:

1
2
3
4
5
6
7
8
0
0
Animal
Dog
100
100
Animal's name
Dog

从上面的实验可以看出,子类继承父类后,初始状态下,继承了父类的属性。

当在子类中修改继承过来的类属性时,并不会修改父类的同名类属性。以后只要是通过子类访问该属性,访问的都是子类的属性;

通过父类修改了父类属性后,子类访问该属性时,会访问父类修改后的属性值。前提是子类没有对该属性重新赋值过,如果子类修改过该属性,则会遵循上面的规则


转载请注明本网址。