【我要学python】面对对象编程之继承和多态

class animal(object):
def run():
print('animal is running...')

class dog(animal):
def run(self):
print('dog is running...')
def eat(self):
print('Eating meat')
class cat(animal):
pass

a=dog() #dog和cat自动拥有了父类animal的run()方法
a.run() #子辈的run()方法覆盖了父辈的run()方法,从而多态
a.eat() #要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样
cat.run()

class Timer(object):
def run(): #run方法中不能写self
print('Start...')

d=Timer
d.run()

输出内容:
dog is running...
Eating meat
animal is running...
Start...

 

我们可以从某个现有的class继承定义一个class,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)如:class Dog(Animal): 而不是class Dog(object):

好处:1.子类能获得父类的全部功能,包括父类的方法 2.多态:子类的实例既是属于子类,也属于父类。

注意:子类会继承父类的方法,但当子类有同样的方法,如run(),子类会覆盖父类,运行时会调用子类的run()

多态好处:只要确认是某类型,就可以调用该类型的方法,如果子类实例有同名方法,则调用子类方法,否则调用父类方法,这样不必再为子类单独建立一个函数调用方法 如: def run_twice(animal): animal.run() 子类Dog不需要再建立一个函数调用Dog.run,而直接使用run_twice(Dog)就行,而且其实是使用子类方法Dog.run。在调用时也不需要管内部细节,直接调用,运行时会自动根据该对象的确切类型(是否子类,子类是否有同样方法)决定。 同时,继承和多态还可以一级一级继承下去

静态语言 vs 动态语言 对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法

对于动态语言Python来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了

简单来说就是,动态语言不一定需要传入Animal类型,而只需要该类型定义了run()的方法就可以调用run_twice()。静态语音如Java则不行,必须传入Animal类型的



猜你喜欢

转载自www.cnblogs.com/tomq/p/10097921.html