5

假设我们有一个 Python 类,它使用abc模块来定义一个抽象属性:

import abc

class A(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractproperty
    def test_attribute(self):
        raise NotImplementedError

现在让我们考虑通过添加一个新方法 ( )来定义B子类,以及实现最初在 中声明的抽象方法的子类:Atest_method()CBA

class B(A):

    def test_method(self):
        pass

class C(B):

    def test_attribute(self):
        # Implement abstract attribute
        pass

假设我想保持B抽象(不可实例化),我应该重新定义抽象属性(test_attribute)和元类赋值B吗?A或者从(如上面的代码中)继承它们就足够了吗?

我知道 Python 允许我不重新定义抽象方法,从而从父类继承它们。从理论软件工程的角度来看,这是否正确?

我这样问是因为如果我没记错的话,其他语言(例如 Java)不允许继承抽象方法而不将它们重新实现为抽象...

4

1 回答 1

5

您几乎已经获得了所有代码,您可以随时对其进行测试,看看它是否有效……但作为剧透,您的设计很好,只要C.test_attributeproperty.

如果您尝试创建 的实例B,那么您将遇到问题,因为尚未创建整个抽象接口,但可以将其创建为C(以及以后可能的其他类......)的基类

例如:

import abc

class A(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractproperty
  def foo(self):
    pass

class B(A):
  def bar(self):
    return "bar"

class C(B):
  @property
  def foo(self):
    return "foo"

print C().foo    # foo
print C().bar()  # bar
print B().foo    # TypeError
于 2014-05-20T20:03:25.390 回答