【问题标题】:Python: enforcing abstract methodPython:强制执行抽象方法
【发布时间】:2019-08-09 10:38:18
【问题描述】:

我编写了以下代码来演示必须由其子类实现的抽象方法。我读到,当父类中的方法被装饰为抽象时,其子类必须实现它,否则无法实例化。但是,在下面的代码中,“Slug”子类没有实现抽象方法,但它仍然可以实例化而不会引发错误。我以为在这种情况下 Python 会抱怨?

我是不是误会了什么?

谢谢

import abc

class Animal(object):

    __metaclass__ = abc.ABCMeta

    def __init__(self, species):
        self._species=species

    def get_species(self):
        return self._species

    @abc.abstractmethod
    def eat(self):
        pass

class Slug(Animal):

    def __init(self, species):
        super(species)

    def run(self):
        print("running")

    # def eat(self):
    #     pass


sl = Slug("slug")
print(sl.get_species())

【问题讨论】:

    标签: python abc


    【解决方案1】:

    不,你完全理解!只是abc.ABCMeta的python 3语法是:

    class Animal(metaclass=abc.ABCMeta):
        ...
    

    而不是在 python 2 中使用的__metaclass__ = abc.ABCMeta。或者你可以从ABC 继承:class Animal(abc.ABC):。见doc

    然后:

    class Slug(Animal):
    
        def __init(self, species):
            super.__init__(species)
    
        ...
    

    这将导致

    Traceback (most recent call last):
      File "/home/.../...py", line 33, in <module>
        sl = Slug("slug")
    TypeError: Can't instantiate abstract class Slug with abstract methods eat
    

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 2014-11-25
      • 2017-09-29
      • 2018-12-13
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多