【发布时间】:2015-01-14 14:34:48
【问题描述】:
假设我需要实现一个抽象 Python 接口,该接口将具有许多派生类(每个派生类名称相同,但编写在不同的模块中),并且在基类中我需要一个通用方法,该方法将使用特定的导入派生类'静态方法。
所以我的玩具模块看起来像这样:
abstract_class.py
from abc import ABCMeta, abstractmethod
from derived_class import Derived
class Abstract:
__metaclass__ = ABCMeta
@abstractmethod
def foo(self):
pass
def bar(self):
Derived.foo()
derived_class.py
from abstract_class import Abstract
class Derived(Abstract):
@staticmethod
def foo():
print 'Good news everyone!'
if __name__ == '__main__':
derived_object = Derived()
derived_object.bar()
当然,当我尝试运行 derived_class.py 时,我会收到抽象名称导入错误。
我该如何正确组织这个?
【问题讨论】:
-
为什么不让
Abstract.bar直接打电话给self.foo? -
我感觉你可能在XY Problem。但无论如何,你不应该使用circular imports,即使它不会带来真正的危险。另外 - 你可能想看看Python Super and Inheritance
-
@jonrsharpe 因为它会调用 Abstract.foo,它不会打印任何东西
-
不在
derived_object中,它不会,因为self是Derived实例,而foo是@staticmethod,而不是@abstractmethod。试试看! -
@jonrsharpe 刚试过,所以
def bar(self): self.foo(),如果我从派生类调用 bar() 它不会打印任何东西
标签: python static abstract-class static-methods