我可能来自不同的思维方式,主要是C++程序员。这个问题涉及Python中的面向对象编程,更具体地说是纯虚方法。因此,从这个问题中我改编的代码,我正在查看这个基本示例。
class Animal():
def speak(self):
print("...")
class Cat(Animal):
def speak(self):
print("meow")
class Dog(Animal):
def speak(self):
print("woof")
my_pets = [Dog(), Cat(), Dog()]
for _pet in my_pets:
_pet.speak()
所以你可以看到它调用不同的派生类的speak函数。现在我的问题是,鸭子类型很好,我认为我已经掌握了它。然而,在Python中追求更严格的面向对象编程是否有错?所以我看了看抽象基类,特别是abstractmethod。对我来说,这似乎只是允许我使用super调用基类方法。在Python中有没有办法/原因使speak()
变成纯函数,这样实现一个没有speak方法的派生动物会抛出错误?
我这样追求的理由是,在编写模块和框架时,如果你希望其他人进行子类化,这将为他们自我记录需要实现该函数的事实。一个可能非常糟糕的想法是像这样使基类的 "纯" 函数抛出异常。问题是这个错误是在运行时发现的!
class VirtualException(BaseException):
def __init__(self, _type, _func):
BaseException(self)
class Animal():
def speak(self):
raise VirtualException()
class Cat(Animal):
def speak(self):
print("meow")
class Dog(Animal):
def speak(self):
print("woof")
class Wildebeest(Animal):
def function2(self):
print("What!")
my_pets = [Dog(), Cat(), Dog(), Wildebeest()]
for _pet in my_pets:
_pet.speak()
abstractmethod
的作用。您能否澄清一下您需要什么,而abstractmethod
无法提供呢?对于任何东西,您都不会得到“编译时”解决方案,因为Python在C++意义上并没有真正的编译时。但是,abstractmethod
允许您在类定义时(在实例化之前)就获得错误提示。 - BrenBarn