首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中的抽象方法

Python中的抽象方法
EN

Stack Overflow用户
提问于 2010-12-08 07:58:20
回答 4查看 266.5K关注 0票数 268

我在Python中使用继承时遇到了问题。虽然这个概念在Java中对我来说似乎太容易了,但到目前为止,我还不能理解Python,这至少让我感到惊讶。

我有一个原型,如下:

class Shape():
   def __init__(self, shape_name):
       self.shape = shape_name

class Rectangle(Shape):
   def __init__(self, name):
       self.shape = name

在上面的代码中,我如何创建一个需要为所有子类实现的抽象方法?

EN

回答 4

Stack Overflow用户

发布于 2010-12-08 08:25:02

在介绍abc之前,您会经常看到这种情况。

class Base(object):
    def go(self):
        raise NotImplementedError("Please Implement this method")


class Specialized(Base):
    def go(self):
        print "Consider me implemented"
票数 330
EN

Stack Overflow用户

发布于 2010-12-08 08:01:20

请参阅abc module。基本上,您在类上定义__metaclass__ = abc.ABCMeta,然后用@abc.abstractmethod修饰每个抽象方法。除非重写了所有抽象方法,否则无法实例化从该类派生的类。

如果您的类已经在使用元类,那么可以从ABCMeta而不是type派生它,这样您就可以继续使用自己的元类。

一种廉价的替代方法(也是引入abc模块之前的最佳实践)是让您的所有抽象方法只引发一个异常(NotImplementedError是一个很好的异常),这样从它派生的类就必须覆盖该方法才能有用。

然而,abc解决方案更好,因为它根本不会实例化这样的类(即,它“失败得更快”),还因为您可以在派生类中使用super()函数提供每个方法的默认或基本实现。

票数 47
EN

Stack Overflow用户

发布于 2016-03-19 12:02:39

抽象基类是很有魔力的。我定期使用它们实现一些东西,并对自己的聪明感到惊讶,不久之后,我发现自己完全被自己的聪明搞糊涂了(尽管这可能只是个人的限制)。

实现这一点的另一种方法(如果你问我,应该在python std库中)是制作一个装饰器。

def abstractmethod(method):
    """
    An @abstractmethod member fn decorator.
    (put this in some library somewhere for reuse).

    """
    def default_abstract_method(*args, **kwargs):
        raise NotImplementedError('call to abstract method ' 
                                  + repr(method))
    default_abstract_method.__name__ = method.__name__    
    return default_abstract_method


class Shape(object):

    def __init__(self, shape_name):
       self.shape = shape_name

    @abstractmethod
    def foo(self):
        print "bar"
        return

class Rectangle(Shape):
    # note you don't need to do the constructor twice either
    pass  

r = Rectangle("x")
r.foo()

装饰器不是我写的。我突然想到有人会这么做的。你可以在这里找到:http://code.activestate.com/recipes/577666-abstract-method-decorator/ Good one jimmy2times。请注意该页r.e底部的讨论。装饰器的类型安全性。(如果有人愿意的话,这可以用inspect模块来修复)。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4382945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档