Class类
对于多态的理解:在菜鸟教程中,作者把多态这部分定义为对父类方法的重写。
子类可以直接在类定义中重写书写父类的方法而不会影响到父类的方法的实现。
教材:《Python基础与大数据应用》这本书将这部分操作定义为类的多态,这部分操作叫做类的多态性,每一个子类都可以对父类进行重定义。
class Animal: def __init__(self, name): self.name = name def say_myname(self): print('In Animal class:my name is %s' % self.name)class Cat(Animal): def __init__(self, name): self.name = name def say_myname(self): print('In Cat class:my name is %s' % self.name)class Dog(Animal): def __init__(self, name): self.name = name def say_myname(self): print('In Dog class:my name is %s' % self.name)class Tiger(Animal): def __init__(self, name): super().__init__(name) self.name = name def say_myname(self): print('In Tiger class:my name is %s' % self.name)def test_function(obj): print('%s say:' % obj.name) obj.say_myname()animal1 = Animal('animal')cat = Cat('cat')dog = Dog('dog')tiger = Tiger('tiger')ls = [animal1, cat, dog, tiger]for i in ls: print(i.name) test_function(i)print(isinstance(animal1,Animal))print(isinstance(cat,Animal))print(isinstance(cat,Cat))print(isinstance(dog,Animal))print(isinstance(dog,Dog))print(isinstance(tiger,Animal))print(isinstance(tiger,Tiger))
在这份代码中,我们不仅可以在子类中重新构建父类的方法,还可以通过子类创建实例化对象,而且这种实例化对象既是子类的实例,也是父类的实例,这一点体现的就是变量的多态性。
还是在这份代码中,我们创建了一个函数(test_function)用于测试对象输出,它的参数传递是任意的,传递类的多个实例化对象,例如:tiger,dog,cat。
关于第三点,这里可以做一个代码对比,加深印象
class Book: price = '100$' def __init__(self, m): self. weight = m def location(self): self. location = 'Wuhan'book1 = Book('100kg')book2 = Book('100kg')print(book1. weight)print(book2. weight)print(book1. price)Book.price = '199'print(book1. price)print(book2. price)book1. weight = '99kg'# print(Book. weight)print(book2. weight)
我们可以看到,实例化对象book1在进行实例化的过程中直接向对象传递了参数,那么比较可以得知,参数的多态性,在上一份代码中,指的是传入的实例化对象,被传入的实例化对象完成自己描述自己的功能(函数功能)。
但对于多态的理解并不能止步于此,我们可以参照廖雪峰老师的文章:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017497232674368#0
先看完整代码:
class Animal: def run(self): print('Animal is running^_^')class Cat(Animal): def run(self): print('Cat is running%__%')class Dog(Animal): def run(self): print('Dog is running.*/*/')class Stone(Animal): passdef run_twice(Animal): Animal.run() Animal.run()run_twice(Dog())c = Cat()a = Animal()print(isinstance(c, Cat))print(isinstance(c, Animal))print(isinstance(a, Cat))print(isinstance(a, Animal))
首先我们可以发现,对子类创建的实例化对象也是父类的一个实例化对象,但是反之,不成立。——归属
其次函数的参数是类对象,当然它也可以是一般的参数,比如数字,数值之类的,这里体现了参数的多态 。 ——参数
仔细比较父类后面的三个子类,可以发现他们的区别在于print语句的内容,虽然可以直接继承,但子类都对他们进行了修改。 ——属性
综上所述,我们可以发现,多态体现在参数,实例化对象归属以及类属性的多样。
1,方法重写
2,实例化可以归属多个类
3,函数参数类型多样
参考与引用
菜鸟教程,类重写:https://www.runoob.com/python3/python3-class.html
廖雪峰的官方网站,继承和多态https://www.liaoxuefeng.com/wiki/1016959663602400/1017497232674368#0
Python基础和大数据应用 丁辉主编 2020年第一版 p86