我正在寻找从注册为 ABC 的子类的类的实例中调用抽象基类方法的正确方法。这是一些非常基本的测试代码,首先要弄清楚如何使其工作。这是我目前所在的位置:
from abc import ABCMeta
# Dog class
class Dog(object):
def speak(self):
pass
def move(self):
pass
# Barking behaviors
class Bark(object):
__metaclass__ = ABCMeta
def speak(self):
print "bark bark bark"
class Howl(object):
__metaclass__ = ABCMeta
def speak(self):
print "ahwoooooo"
# Movement behaviors
class Run(object):
__metaclass__ = ABCMeta
def move(self):
print "I'm running"
class Walk(object):
__metaclass__ = ABCMeta
def move(self):
print "I'm walking"
# Dog implementations
class Beagle(Dog):
pass
Howl.register(Beagle)
Run.register(Beagle)
nora = Beagle()
nora.speak() # THIS IS THE ISSUE: Calls speak() from original Dog class
nora.move() # Need to call move() from registered ABC
# Test to be sure .register() was used properly
assert isinstance(nora, Howl)
虽然这种方法似乎过于复杂地改变了两个 Dog 方法,但我希望能够灵活地将行为分配给未知数量的实例。我希望能够在实例不知道实际行为的情况下调用 speak() 和 move()。我也喜欢这种方法,因为我也能够轻松删除或更改注册类的行为,而无需更改任何现有代码。
当前代码读取的方式 nora.speak() 和 nora.move() 调用从 Dog 到 Beagle 的继承方法,其中只包含 pass。
如果有人对我需要做什么以使注册行为的方法可调用有任何见解,或者我的方法是否完全有缺陷,我将不胜感激。