在Python 3中实现抽象方法

时间:2017-05-27 15:05:22

标签: python

我只是想在Python中练习编写一个抽象方法,我有以下代码:

import abc
class test(abc.ABC):
    @abc.abstractmethod
    def first(self,name):
        """This is to be implemented"""

class Extendtest(test):
    def __init__(self,name):
        self.name = name

    def first(self):
        print ("Changing name!")
        self.name = "Shaayan"

    def second(self,value):
        print ("Adding second argument!")
        self.value = value

e = Extendtest("Subhayan")
print (e.name) 
e.first()
print (e.name)

我故意改变了抽象方法实现中第一个方法的签名。

但是,如果我更改签名,Python不会发出任何错误,并且正在按预期进行。

在Python中我没有办法强迫严格抽象吗?

1 个答案:

答案 0 :(得分:1)

这不是一个关于python和简短答案的新问题:

不,这是不可能的。最简单的方法是重用像zope这样的自定义库,或者自己实现这种行为。

ABC有一项提案要检查论据,这就是Guido对此的回答:

  

这不是一个新想法。到目前为止,我一直拒绝它,因为我   担心误报和漏报。尝试去   强制该方法应该行为(甚至它的返回   类型)是没有希望的;可以有多种原因来修改   参数列表仍然符合接口的(意图)。   我也担心它会减慢一切。

     

那就是说,如果你想提供一个可以的标准机制   可选以启用以检查参数一致性,例如通过在子类上使用类或方法装饰器,我会没问题   (只要它纯粹在类定义时运行;它不应该慢   down class instantiation或方法调用)。它甚至可能会发现   一些错误。它也肯定必须调整以避免确定   上课误报。

reference to the thread