Python面向对象编程(三)攻略
本文是Python面向对象编程系列的第三篇,主要介绍面向对象编程中的继承与多态。
继承
在面向对象编程中,一个类可以派生出子类,子类可以继承父类的属性和方法。这种机制就叫做继承。
定义子类并继承父类
子类的定义方法很简单,我们只需要在类名后面加上一个括号,在括号内写上父类的名字即可。如果父类是Python内置的类型,则可以省略父类的名字。
示例代码:
class Animal: # 定义一个父类
def __init__(self, name):
self.name = name
def show_info(self):
print('我叫{}'.format(self.name))
class Dog(Animal): # 定义一个继承父类Animal的子类Dog
def __init__(self, name, color):
super().__init__(name) # 调用父类的构造函数
self.color = color
def bark(self):
print('汪汪汪...')
dog = Dog('旺财', '黄色')
dog.show_info() # 我叫旺财
dog.bark() # 汪汪汪...
在上面的示例中,我们定义了一个父类Animal,它拥有一个构造函数和一个实例方法show_info。然后我们定义了一个继承Animal的子类Dog,它拥有一个构造函数和一个实例方法bark。在子类的构造函数中,我们使用super().init(name)调用了父类的构造函数,以便子类继承到了父类的属性。最后我们创建了一个Dog类的实例dog,并通过dog的bark方法和show_info方法,分别调用了子类Dog和父类Animal中的方法。
覆盖父类的方法
子类可以覆盖父类的方法。我们只需要在子类中重新定义一个与父类同名的方法即可。当对象调用该方法时,会先去子类中查找是否有该方法。如果有,则调用子类的方法,如果没有,则调用父类的方法。
示例代码:
class Animal:
def __init__(self, name):
self.name = name
def show_info(self):
print('我叫{}'.format(self.name))
class Dog(Animal):
def __init__(self, name, color):
super().__init__(name)
self.color = color
def bark(self):
print('汪汪汪...')
def show_info(self): # 覆盖父类的show_info方法
print('我叫{},我的颜色是{}'.format(self.name, self.color))
dog = Dog('旺财', '黄色')
dog.show_info() # 我叫旺财,我的颜色是黄色
在上面的示例中,我们重新定义了子类Dog的show_info方法,并覆盖了父类Animal的show_info方法。
多态
多态是面向对象编程中的一个重要特性。它可以让我们在同一操作作用于不同的对象时,产生不同的行为。
多态的实现
在Python中,实现多态可以通过鸭子类型和继承两种方式。
鸭子类型
鸭子类型是Python中的一种动态类型判断方式。它认为如果一个对象看起来像鸭子,那么它就可以被当做鸭子来使用。这种方式可以在不继承父类的情况下实现多态。
示例代码:
class Duck:
def quack(self):
print('嘎嘎嘎...')
class Chicken:
def cluck(self):
print('咯咯咯...')
def make_sound(obj):
if hasattr(obj, 'quack'):
obj.quack()
elif hasattr(obj, 'cluck'):
obj.cluck()
duck = Duck()
chicken = Chicken()
make_sound(duck) # 嘎嘎嘎...
make_sound(chicken) # 咯咯咯...
在上面的示例中,我们定义了两个类Duck和Chicken,它们分别拥有quack和cluck方法。然后我们定义了一个函数make_sound,它接收一个对象作为参数,并调用该对象的quack或cluck方法。在make_sound函数中,我们通过hasattr(obj, 'quack')和hasattr(obj, 'cluck')来判断obj是否拥有quack或cluck方法,从而实现了鸭子类型的多态。
继承
在父类中定义一个方法,子类可以重写这个方法,从而实现多态。
示例代码:
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
print('汪汪汪...')
class Cat(Animal):
def speak(self):
print('喵喵喵...')
def animal_speak(animal):
animal.speak()
dog = Dog()
cat = Cat()
animal_speak(dog) # 汪汪汪...
animal_speak(cat) # 喵喵喵...
在上面的示例中,我们定义了一个父类Animal和两个子类Dog和Cat。在父类Animal中定义了一个speak方法,该方法在子类中被重写。然后我们定义了一个函数animal_speak,该函数接收一个Animal类型的参数,并调用该参数的speak方法。在调用时,会根据实际的对象类型,调用该对象的speak方法,从而实现了继承的多态。
总结
继承和多态是面向对象编程中两个重要的特性。通过继承,子类可以继承父类的属性和方法,从而使得代码复用更加方便。而通过多态,我们可以在同一操作作用于不同的对象时,产生不同的行为,从而让代码更加灵活。通过本文的示例代码,希望读者能够掌握面向对象编程中的继承和多态的使用方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python面向对象编程(三) - Python技术站