gpt4 book ai didi

python - Python 中的抽象方法继承

转载 作者:行者123 更新时间:2023-11-28 17:41:18 26 4
gpt4 key购买 nike

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

import abc

class A(object):
__metaclass__ = abc.ABCMeta

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

现在让我们考虑通过添加新方法 (test_method()) 和 C 来定义 A 的子类 B 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_attribute 得到,您的设计就很好用 property 装饰。

如果您尝试创建 B 的实例,那么您将遇到问题,因为尚未创建整个抽象接口(interface),但可以将其创建为 的基类code>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

关于python - Python 中的抽象方法继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23768767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com