作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我注意到这一点时,我正在使用 dir()
内置函数:
>>> dir(type)
['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__prepare__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__text_signature__', '__weakrefoffset__', 'mro']
>>> type.__abstractmethods__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __abstractmethods__
>>> list.__abstractmethods__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __abstractmethods__
我不明白,它出现在列表中,为什么我会收到这样的错误?
最佳答案
__abstractmethods__
是一个 descriptor支持Abstract Base Classes ;它包装了一个默认为空的 slot(因此描述符会引发属性错误)。最重要的是,它是 CPython 如何处理抽象方法的实现细节。
该属性用于跟踪哪些方法是抽象的,以便在实例不提供具体实现时阻止创建实例:
>>> import abc
>>> class FooABC(metaclass=abc.ABCMeta):
... @abc.abstractmethod
... def bar(self):
... pass
...
>>> FooABC.__abstractmethods__
frozenset({'bar'})
>>> class Foo(FooABC): pass
...
>>> Foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Foo with abstract methods bar
abc.ABCMeta
实现设置了 __abstractmethods__
属性,并且 type()
使用它来检查任何应该被调用的抽象方法已实现但尚未实现。
关于python - __abstractmethods__ 和 AttributeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24914584/
当我注意到这一点时,我正在使用 dir() 内置函数: >>> dir(type) ['__abstractmethods__', '__base__', '__bases__', '__basics
我是一名优秀的程序员,十分优秀!