`staticmethod` 和 `abc.abstractmethod`:它会混合吗?
在我的 Python 应用程序中,我想创建一个既是 staticmethod
又是 abc.abstractmethod
。我该怎么做?
我尝试应用这两个装饰器,但它不起作用。如果我这样做:
import abc
class C(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
@staticmethod
def my_function(): pass
我会得到一个异常*,如果我这样做:
class C(object):
__metaclass__ = abc.ABCMeta
@staticmethod
@abc.abstractmethod
def my_function(): pass
不强制执行抽象方法。
如何创建抽象静态方法?
*例外情况:
File "c:\Python26\Lib\abc.py", line 29, in abstractmethod
funcobj.__isabstractmethod__ = True
AttributeError: 'staticmethod' object has no attribute '__isabstractmethod__'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
从Python 3.3开始,可以结合
@staticmethod
和@abstractmethod
,因此其他建议不再是必要的:@abstractstaticmethod
自版本 3.3 (但在 Python 3.13 中仍然存在)。Starting with Python 3.3, it is possible to combine
@staticmethod
and@abstractmethod
, so none of the other suggestions are necessary anymore:@abstractstaticmethod
has been deprecated since version 3.3 (but is still there in Python 3.13).这样就可以了:
你会说“呃?它只是重命名@abstractmethod”,这是完全正确的。因为上面的任何子类都必须包含 @staticmethod 装饰器。除了在阅读代码时作为文档之外,您在这里不需要它。子类必须如下所示:
要拥有一个强制您将此方法设为静态方法的函数,您必须将 ABCmeta 子类化以检查并强制执行它。这是大量的工作却没有真正的回报。 (如果有人忘记了 @staticmethod 装饰器,他们无论如何都会得到一个明显的错误,它只是不会提到静态方法。
所以事实上这也同样有效:
更新 - 另一种解释方式:
方法是静态的,它控制它如何被称为。
抽象方法永远不会被调用。
因此,除了用于文档目的之外,抽象静态方法是一个毫无意义的概念。
This will do it:
You go "Eh? It just renames @abstractmethod", and this is completely correct. Because any subclass of the above will have to include the @staticmethod decorator anyway. You have no need of it here, except as documentation when reading the code. A subclass would have to look like this:
To have a function that would enforce you to make this method a static method you would have to subclass ABCmeta to check for that and enforce it. That's a lot of work for no real return. (If somebody forgets the @staticmethod decorator they will get a clear error anyway, it just won't mention static methods.
So in fact this works just as well:
Update - Another way to explain it:
That a method is static controls how it is called.
An abstract method is never called.
And abstract static method is therefore a pretty pointless concept, except for documentation purposes.
目前这在 Python 2.X 中是不可能的,它只会强制该方法是抽象的或静态的,但不能同时是两者。
在Python 3.2+中,添加了新的装饰器
abc.abstractclassmethod
和abc.abstractstaticmethod
,以将它们的抽象和静态或抽象和类方法的强制结合起来。请参阅 Python 问题 5867
This is currently not possible in Python 2.X, which will only enforce the method to be abstract or static, but not both.
In Python 3.2+, the new decorators
abc.abstractclassmethod
andabc.abstractstaticmethod
were added to combine their enforcement of being abstract and static or abstract and a class method.See Python Issue 5867
文档如下所示:
因此,
@abstractmethod
必须是最内层的装饰器,如下所示:然后,您需要在子类如下所示:
然后,您可以实例化子类并调用它们,如下所示:
输出:
您可以看到 我的回答解释了抽象属性。
The documentation says below:
So,
@abstractmethod
must be the innermost decorator as shown below:Then, you need to override them in the child class as shown below:
Then, you can instantiate the child class and call them as shown below:
Output:
You can see my answer which explains about abstract property.