python类方法继承_python类的继承和多态

在面向对象(OOP)程序设计中,当定义一个class的时候,可从某个现有的class继承

新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)

格式:

子类名(父类名):

pass

使用示例

class Animal(object):

def run(self):

print('Animal is running...')

class Dog(Animal):

pass

class Dog1(Animal):

def run(self):

print('Dog is running...')

def run_twice(animal):

animal.run()

animal.run()

dog = Dog()

dog.run() #输出:Animal is running...

dog1 = Dog1()

dog1.run() #输出:Dog is running...,执行子类自己的方法

run_twice(Animal())

#输出:Animal is running...

#输出:Animal is running...

run_twice(Dog1())

#输出:Dog is running...

#输出:Dog is running...

#新追加一个子类型Tortoise,然后调用run_twice函数,依然可以运行

class Tortoise(Animal):

def run(self):

print('Tortoise is running slowly...')

run_twice(Tortoise()) #调用run_twice函数,依然可以运行,确保传入的对象有run()方法即可

#输出:Tortoise is running slowly...

#输出:Tortoise is running slowly...

class_exam.png

数据类型判断

定义一个class实际上就是定义一种数据类型,该数据类型和Python自带的数据类型,比如str、list、dict完全一样

判断一个变量是否是某个类型可以用isinstance()判断

对于isinstance(a, A),则

如果a是A类对象,返回true

如果a是A类子类对象,返回true

其他都返回false

关于继承

1) 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写

子类通过继承获得了所有父类的方法(包括init方法,如果父类的该方法有参数,则子类创建实例时也要传参数)

2) 当子类和父类都存在相同的方法时,子类覆盖了父类的该方法,运行时,总是会调用子类方法,这就是就是多态

3) 继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系

而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树

关于多态

调用方只管调用,不管细节,而当新增一种子类时,只要确保方法编写正确,不用管原来的代码是如何调用的

说白了,就是不管怎么追加子类,也不需要修改原来的代码

这就是著名的”开闭”原则:

对扩展开放:允许子类重写方法函数

对修改封闭:不重写,直接继承父类方法函数

静态语言和动态语言

如果一个方法,要传入的参数是A类对象,方法内部需要调用该参数的run()方法,则:

对于Java这样的动态语言,则一定要传入A类或者其子类对象,否则将无法调用方法

对于Python这样的动态语言,则不一定要传入A类或其子类对象,只需保证传入的对象有一个run()方法即可

这就是动态语言的”鸭子类型”,它并不要求严格的继承体系,一个对象只要”看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子

关于file-like object

Python的”file-like object”就是一种鸭子类型

真正的文件对象都有一个read()方法,但许多对象,只要有read()方法,都被视为”file-like object”

许多函数接收的参数就是”file-like object”,不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值