带有具体方法的Python抽象类

带有具体方法的Python抽象类,python,class,oop,inheritance,abstract-class,Python,Class,Oop,Inheritance,Abstract Class,我想知道在python(3)中,抽象类是否可以有具体的方法。 虽然这似乎可行,但我不确定这是在python中实现这一点的正确方法: from abc import ABCMeta, abstractclassmethod, abstractmethod class MyBaseClass: __metaclass__ = ABCMeta @property @abstractmethod def foo_prop(self): """Defi

我想知道在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
从abc导入ABCMeta,abstractclassmethod,abstractmethod
类别MyBaseClass:
__元类_uu=ABCMeta
@财产
@抽象方法
def foo_道具(自身):
“定义我”
通过
@抽象类方法
def get_某物(cls,参数1,参数2,参数3):
“”“这是一个类方法,请用@classmethod重写它”“”
通过
@类方法
def get(cls,参数1,参数2):
“”“调用抽象类方法和抽象属性的具体方法”“”
如果参数1
在该示例中,抽象类
MyBaseClass
具有:

  • 将在子类中定义的抽象属性
    foo_prop
    • 我能找到的唯一声明方法是创建一个抽象的“属性方法”
  • 将在子类中实现的抽象类方法
    get\u something
  • 一种具体的方法
    get
    ,它依次使用上述(尚未定义的)抽象方法和属性
问题

  • 有没有更好的方法来定义抽象属性?在
    MyBaseClass
    中定义一个具体的属性设置为None并在子类中重新定义它是否更有意义

  • 我可以在一个抽象类中混合抽象方法和具体方法吗

  • 如果是,那么声明类抽象是否总是有意义,或者一个具体的类是否可以有抽象方法(在这种情况下,无论如何都不应该直接实例化它)

  • 谢谢

  • 根据(括号中的文本和我的代码格式):

    [
    @abstractproperty
    自3.3版以来已被弃用:现在可以使用
    property
    property.getter()
    property.setter()
    property.deleter()
    abstractmethod()
    一起使用,使此修饰符变得多余

    所以我认为你做得对

  • 你可以这样做,或者至少根据我的经验,这不是一个问题。也许其他人可以提供其他建议,但这种建议可能会采取“继承是坏的”的形式。尽管我在文档中没有看到任何关于它的明确内容,其中抽象方法、具体方法和类方法都是在ABC中定义的

  • 我相信为了使用
    @abstractmethod
    和类似的装饰器,您仍然必须声明类抽象。通过将元类设置为ABC,在定义所有抽象方法之前无法实例化该类,这听起来像是您想要的行为,因此我认为您需要将其声明为抽象类,除非您只想依靠文档在该类上强制执行“您不应实例化”规则。作为旁白:

    abc
    继承,而不是手动设置元类。我认为这种结构更可取


  • 与Engineero所说的类似,我还发现了一个类似于此场景的示例:
    from abc import ABC
    class MyBaseClass(ABC):
        # ...