博客
关于我
Python学习:继承
阅读量:360 次
发布时间:2019-03-04

本文共 2708 字,大约阅读时间需要 9 分钟。

Python 继承与多态入门指南

一、基础

1. 继承

继承是一种让相似的东西得以自动传递的机制。被继承的类称为基类、父类或超类,而继承者称为子类。子类可以继承父类的属性和方法,但也可以通过重写方法来改变其行为。

1.1 语法

类继承的语法非常简单。定义一个新类时,可以在class语句后面指定它的父类:

class Parent:    def hello(self):        print('调用父类的方法')class Child(Parent):    passc = Child()c.hello()  # 调用父类的方法

如果子类中定义了与父类同名的方法或属性,会自动覆盖父类的对应方法或属性:

class CChild(Parent):    def hello(self):        print('重写了父类的方法')d = CChild()d.hello()  # 重写了父类的方法

1.2 案例

import random as fclass Fish:    def __init__(self, name):        self.name = name        self.x = f.randint(0, 10)        self.y = f.randint(0, 10)    def move(self):        self.x -= 1        print(f'{self.name} 的位置是:{self.x} {self.y}')class Goldfish(Fish):    passclass Carp(Fish):    passclass Salmon(Fish):    passclass Shark(Fish):    def __init__(self, name):        self.name = name        self.hugry = True    def eat(self):        if self.hugry:            print(f'老子是 {self.name}, 老子怕过谁')            self.hugry = False        else:            print(f'算你小子走运,今天 {self.name}我没胃口')fish = Fish('鱼类')fish.move()  # 鱼类的位置是:8 9goldfish = Goldfish('金枪鱼')goldfish.move()  # 金枪鱼的位置是:6 2shark = Shark('大鲨鱼')shark.eat()  # 老子是 大鲨鱼,老子怕过谁shark.eat()  # 算你小子走运,今天 大鲨鱼我没胃口

注意到Shark类重写了__init__方法,但没有调用父类的初始化方法,导致xy属性缺失。正确的做法是使用super().__init__()

class Shark(Fish):    def __init__(self, name):        super().__init__(name)        self.hugry = True    def eat(self):        if self.hugry:            print(f'老子是 {self.name}, 老子怕过谁')            self.hugry = False        else:            print(f'算你小子走运,今天 {self.name}我没胃口')shark = Shark('大白鲨')shark.move()  # 大白鲨的位置是:7 3

2. 调用未被绑定的父类方法

在子类中,可以直接调用父类的方法。这里的“未被绑定”指的是用子类的实例对象代替父类的实例对象:

class Shark(Fish):    def eat(self):        if self.hugry:            print(f'老子是 {self.name}, 老子怕过谁')            self.hugry = False        else:            print(f'算你小子走运,今天 {self.name}我没胃口')shark = Shark('大白鲨')shark.eat()  # 调用了Shark类的eat方法Fish.eat(shark)  # 调用了Fish类的eat方法

3. 使用 super() 函数

super() 函数不需要明确给出基类的名字,会自动找到所有基类及其对应的方法:

class Shark(Fish):    def __init__(self, name):        super().__init__(name)        self.hugry = True    def eat(self):        if self.hugry:            print(f'老子是 {self.name}, 老子怕过谁')            self.hugry = False        else:            print(f'算你小子走运,今天 {self.name}我没胃口')shark = Shark('大白鲨')shark.move()  # 调用了Fish类的move方法

super() 函数的使用使得类继承关系更加灵活,只需修改class语句中的父类即可。

三、补充

1. 查看类是否是另一个类的子类

可以使用内建函数 issubclass 来检查一个类是否是另一个类的子类:

issubclass(Goldfish, Fish)  # Trueissubclass(Shark, Fish)  # Trueissubclass(Bird, Fish)  # False

2. 多重继承

Python支持多重继承,子类可以继承多个基类:

class Base:    def method(self):        print('Base.method')class Derived(Base1, Base2):    passd = Derived()d.method()  # 调用Base1和Base2的method方法

子类可以不作任何事情,从超类继承所有的行为。

转载地址:http://exar.baihongyu.com/

你可能感兴趣的文章
Objective-C实现fibonacci斐波那契算法(附完整源码)
查看>>
Objective-C实现FIFO(附完整源码)
查看>>
Objective-C实现FigurateNumber垛积数算法(附完整源码)
查看>>
Objective-C实现finding bridges寻找桥梁算法(附完整源码)
查看>>
Objective-C实现first come first served先到先得算法(附完整源码)
查看>>
Objective-C实现fischer yates shuffle洗牌算法(附完整源码)
查看>>
Objective-C实现fisherYates洗牌算法(附完整源码)
查看>>
Objective-C实现frequency finder频率探测器算法(附完整源码)
查看>>
Objective-C实现FTP文件上传(附完整源码)
查看>>
Objective-C实现fuzzy operations模糊运算算法(附完整源码)
查看>>
Objective-C实现Gale-Shapley盖尔-沙普利算法(附完整源码)
查看>>
Objective-C实现gamma recursive伽玛递归算法(附完整源码)
查看>>
Objective-C实现gauss easte高斯复活节日期算法(附完整源码)
查看>>
Objective-C实现gaussian filter高斯滤波器算法(附完整源码)
查看>>
Objective-C实现getline函数功能(附完整源码)
查看>>
Objective-C实现gnome sortt侏儒排序算法(附完整源码)
查看>>
Objective-C实现GraphVertex图顶点算法(附完整源码)
查看>>
Objective-C实现greatest common divisor最大公约数算法(附完整源码)
查看>>
Objective-C实现greedy coin change贪心硬币找零算法(附完整源码)
查看>>
Objective-C实现half adder半加器算法(附完整源码)
查看>>