博客
关于我
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__方法,但没有调用父类的初始化方法,导致x和y属性缺失。正确的做法是使用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/

你可能感兴趣的文章
python3.6.5+cuda9+cudnn7.1+win10+tensorflow-gpu1.9.0下载配置
查看>>
python3.6使用pickle序列化class
查看>>
python3.6入门到高阶(全栈) day027 网络通信协议 osi七层模型
查看>>
Python3.6属性错误:模块‘;异步没有属性‘;运行‘;
查看>>
python3.6版本中的python-weka-wrapper安装失败,错误代码为%1
查看>>
Python3.7安装cv2踩过的坑
查看>>
python写txt文件
查看>>
python关于sorted排序函数详细解析 附实战代码(全)
查看>>
python3.8调用m文件,调用matlab
查看>>
python3.9新特性_Python 3.9 新特性速览
查看>>
Python3.x:遍历select下拉框获取value值
查看>>
python360百科_11月编程排行榜:Python超过Java成第二
查看>>
Python关于Paginator分页函数详细解析 附实战代码
查看>>
python3、ipython3、setup-tools、pip等环境搭建详细总结
查看>>
python3下使用cv2.imwrite存储带有中文路径图片或者绝对路径图片
查看>>
python3与django中@property详解
查看>>
python3中如何表示无穷大
查看>>
Python3中提示:no module named 'wxpy'
查看>>
python3中选择文件对话框的格式打开和保存图片
查看>>
python3为什么print永远都是地址_Python3 print 函数用法总结
查看>>