当前位置: 首页 > article >正文

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


http://www.kler.cn/a/157268.html

相关文章:

  • leetcode hot100【LeetCode 114.二叉树展开为链表】java实现
  • L10.【LeetCode笔记】回文链表
  • 高频 SQL 50 题(基础版)连接部分
  • GitLab 如何跨版本升级?
  • C++笔记---异常
  • LLM时代下Embedding模型如何重塑检索、增强生成
  • Git和Git小乌龟安装
  • make -c VS make -f
  • 电脑发生0x80070002错误,0x80070002错误代码怎么解决
  • G口大带宽是什么意思?
  • Appium:进行iOS自动化测试遇到的问题与解决方案
  • Learning Normal Dynamics in Videos with Meta Prototype Network 论文阅读
  • 网络安全小白自学
  • 【qml入门教程系列】:qml property使用介绍
  • 【static】关键字静态成员:在类级别上共享数据和方法的机制
  • BFS求树的宽度——结合数组建树思想算距离
  • GPT市场将取代插件商店 openAI已经关闭plugins申请,全部集成到GPTs(Actions)来连接现实世界,可以与物理世界互动了。
  • 不再只是android,华为自爆Harmony将对标iOS
  • C# AES-128-CBC 加密
  • 【电源专题】什么是电源管理
  • OpenCV快速入门:移动物体检测和目标跟踪
  • python 运用pandas 库处理excel 表格数据
  • C++11的互斥量
  • C语言枚举
  • react-native实践日记--3.ui-kitten中的button设置字体颜色无效
  • AI医疗交流平台【Docola】申请823万美元纳斯达克IPO上市