python中需要abstractmethod

时间:2019-06-26 06:44:55

标签: python

python中的abstractmethod decorator有什么作用?

from abc import abstractmethod

class Animal(object):   

    @abstractmethod
    def walk(self):
        ''' data '''
        pass

    @abstractmethod
    def talk(self):
        ''' data '''
        pass

class Duck(Animal):
    name = ''

    def __init__(self, name):
        print('duck created.')
        self.name = name

    def walk(self):
        print('walks')

    def talk(self):
        print('quack')

obj = Duck('duck1')
obj.talk()
obj.walk()

但是,如果我注释装饰器,则代码仍然有效。

from abc import abstractmethod

class Animal(object):   

    def walk(self):
        ''' data '''
        pass

    def talk(self):
        ''' data '''
        pass

class Duck(Animal):
    name = ''

    def __init__(self, name):
        print('duck created.')
        self.name = name

    def walk(self):
        print('walks')

    def talk(self):
        print('quack')

obj = Duck('duck1')
obj.talk()
obj.walk()

我的问题是,为什么要麻烦使用这个装饰器?我什至删除了Duck中的某些方法,例如talk。然后它不会崩溃。我让我不明白我们何时需要使用此abstractmethod

1 个答案:

答案 0 :(得分:0)

  

python中的abstractmethod装饰器有什么作用?

checking the doc ?

  

指示抽象方法的装饰器。

     

使用此装饰器要求该类的元类为ABCMeta或   从中得出。具有从ABCMeta派生的元类的类   除非其所有抽象方法和   属性被覆盖。

请注意,在您的示例中,基类Animal不使用ABCMeta,因为它是元类,因此装饰器实际上实际上是无用的。