python - abstractmethod作用 - `staticmethod`和`abc.abstractmethod`:它会混合吗?

python abstract class (4)
在我的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
从Python 3.3开始, 可以将 @staticmethod和@abstractmethod 结合起来 ,因此不再需要其他任何建议:

@staticmethod
@abstractmethod
def my_abstract_staticmethod(…):
目前这在Python 2.X中是不可能的,它只会强制该方法是抽象的或静态的,但不能同时强制执行。

在Python 3.2+中,添加了新的装饰器abc.abstractclassmethod和abc.abstractstaticmethod ,以结合它们的抽象和静态或抽象的实现以及类方法。

请参见Python Issue 5867

这样做:

import abc
abstractstaticmethod = abc.abstractmethod

class A(object):
metaclass = abc.ABCMeta
… @abstractstaticmethod
… def themethod():
… pass

a = A()
Traceback (most recent call last):
File “asm.py”, line 16, in
a = A()
TypeError: Can’t instantiate abstract class A with abstract methods test
你去“呃?它只是重命名@abstractmethod”,这是完全正确的。 因为上面的任何子类都必须包含@staticmethod装饰器。 除了作为阅读代码的文档外,您在此处不需要它。 子类必须如下所示:

class B(A):
… @staticmethod
… def themethod():
… print “Do whatevs”
要拥有一个强制您使此方法成为静态方法的函数,您必须继承ABCmeta以检查并强制执行该方法。 没有真正的回报,这是很多工作。 (如果有人忘了@staticmethod装饰器,他们会得到一个明确的错误,它只是不会提到静态方法。

所以实际上这也适用:

import abc

class A(object):
metaclass = abc.ABCMeta
… @abc.abstractmethod
… def themethod():
… “”“Subclasses must implement this as a @staticmethod”“”
… pass
更新 - 另一种解释方式:

方法是静态的,控制它的调用方式。 永远不会调用抽象方法。 因此,抽象静态方法是一个相当无意义的概念,除了文档目的。

class abstractstatic(staticmethod):
slots = ()
def init(self, function):
super(abstractstatic, self).init(function)
function.isabstractmethod = True
isabstractmethod = True

class A(object):
metaclass = abc.ABCMeta
@abstractstatic
def test():
print 5
原文链接:https://code-examples.net/zh-CN/q/44461b

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值