如何重构多态方法以保持代码DRY

时间:2016-09-23 04:45:28

标签: python polymorphism

以下是我在学习python中的多态行为时正在使用的代码示例。 我的问题是:为什么我必须两次声明show_affection非常相似的功能?为什么不检查调用者(调用方法的实例)以及是否是Dog,做一件事,如果是猫做另一件事。

正如您在下面的示例代码中所看到的,show_affection在继承自Animal的Cat和Dog类中定义。

为什么不在Animal Class中声明show_affection,但我不知道如何检查调用者。像

def show_affection(self):

    If caller is the Dog instance:
        print("{0}.barks".format(self.name))
    else:
        print("{0}.wags tail".format(self.name))

这就是我所拥有的

class Animal(object):

    def __init__(self, name):

        self.name = name
    def eat(self, food):
        print("{0} eats {1}".format(self.name, food))

class Dog(Animal):


    def fetch(self, thing):
        print("{0} goes after the {1}".format(self.name, thing))
    def show_affection(self):
        print("{0} wags tail".format(self.name))


class Cat(Animal):

    def swatstring(self):
        print("{0} shreds the string".format(self.name))

    def show_affection(self):
        print("{0} purrs".format(self.name))


for a in (Dog('rover'), Cat('fluffy'), Cat('precious'), Dog('Scout')):
    a.show_affection()

a.eat('bananas')

1 个答案:

答案 0 :(得分:1)

这不是"重复自己"的一个例子,因为Cat.show_affection()做了与Dog.show_affection()不同的事情。如果两种方法相同,那么您可以通过在Animal中定义一次实现来避免重复。但是,由于您希望CatDog具有不同的行为,正确的方法是在每个类中实现该方法。

一般来说:

  • 特定于猫的行为应在Cat
  • 中定义
  • 应在Dog
  • 中定义特定于狗的行为
  • 适用于所有动物的行为应在Animal
  • 中定义