【发布时间】:2018-05-12 02:46:59
【问题描述】:
我想知道在 python (3) 中,抽象类是否可以有具体的方法。
尽管这似乎可行,但我不确定这是在 python 中执行此操作的正确方法:
from abc import ABCMeta, abstractclassmethod, abstractmethod
class MyBaseClass:
__metaclass__ = ABCMeta
@property
@abstractmethod
def foo_prop(self):
"""Define me"""
pass
@abstractclassmethod
def get_something(cls, param1, param2, param3):
"""This is a class method, override it with @classmethod """
pass
@classmethod
def get(cls, param1, param2):
"""Concrete method calling an abstract class method and an abstract property"""
if param1 < cls.foo_prop:
raise Exception()
param3 = param1 + 42
item = cls.get_something(param1, param2, param3)
return item
class MyConcreteClassA(MyBaseClass):
"""Implementation """
foo_prop = 99
@classmethod
def get_something(cls, param1, param2, param3):
return cls.foo_prop + param1 + param2 + param3
class MyConcreteClassB(MyBaseClass):
"""Implementation """
foo_prop = 255
@classmethod
def get_something(cls, param1, param2, param3):
return cls.foo_prop - param1 - param2 - param3
在示例中,抽象类 MyBaseClass 具有:
- 将在子类中定义的抽象属性
foo_prop- 我能找到声明这一点的唯一方法是创建一个抽象的“属性方法”
- 将在子类中实现的抽象类方法
get_something - 具体方法
get依次使用上述(尚未定义的)抽象方法和属性。
问题:
有没有更好的方法来定义抽象属性?将
MyBaseClass中的具体属性设置为 None 并在子类中重新定义它会更有意义吗?我可以在抽象类中混合抽象和具体方法,如示例所示?
如果是,那么声明类抽象是否总是有意义的,或者具体类是否可以具有抽象方法(在这种情况下,无论如何都不应该直接实例化它)。
谢谢
【问题讨论】:
-
和 Engineero 说的类似,我在这里也找到了一个与这个场景类似的例子:pymotw.com/2/abc/#concrete-methods-in-abcs
标签: python class oop inheritance abstract-class