繁体   English   中英

Python中的抽象方法继承

[英]Abstract method inheritance in Python

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

import abc

class A(object):
    __metaclass__ = abc.ABCMeta

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

现在,让我们考虑定义B从子类A通过增加一种新的方法( test_method()以及C从子类B实施最初在声明的抽象方法A

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)不允许继承抽象方法而不将它们重新实现为抽象...

你几乎得到了所有的代码,你可以随时测试它,看它是否有效...但作为扰流板,你的设计很好,只要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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM