jar*_*ark 6 python abstract-class python-2.x abstract-base-class python-3.x
这是针对这个问题的答案"使用python的abc模块来创建抽象类".(由@alexvassel作为答案接受).
我尝试了这些建议,但奇怪的是,尽管遵循了使用abc方式的建议,但它对我不起作用.因此我在这里将其作为一个问题发布:
这是我的Python代码:
from abc import ABCMeta, abstractmethod
class Abstract(object):
__metaclass__ = ABCMeta
@abstractmethod
def foo(self):
print("tst")
a = Abstract()
a.foo()
Run Code Online (Sandbox Code Playgroud)
当我执行这个模块时,这是我控制台上的输出:
pydev debugger: starting (pid: 20388)
tst
Run Code Online (Sandbox Code Playgroud)
而不是那个被接受的答案
>>> TypeError: Can not instantiate abstract class Abstract with abstract methods foo
Run Code Online (Sandbox Code Playgroud)
那我在做什么是对还是错?为什么工作而不是失败?感谢任何专家对此的见解.
在Python 3中,metaclass在创建抽象基类时使用参数:
from abc import ABCMeta, abstractmethod
class Abstract(metaclass=ABCMeta):
@abstractmethod
def foo(self):
print("tst")
a = Abstract()
a.foo()
Run Code Online (Sandbox Code Playgroud)
在 Python 2 中,您必须这样分配元类:
import abc
class ABC(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def foo(self):
return True
a = ABC()
Run Code Online (Sandbox Code Playgroud)
这引发了一个 TypeError
Traceback (most recent call last):
File "<pyshell#59>", line 1, in <module>
a = ABC()
TypeError: Can't instantiate abstract class ABC with abstract methods foo
Run Code Online (Sandbox Code Playgroud)
但是在 Python 3 中,分配__metaclass__为属性不起作用(如您所愿,但解释器不认为它是错误,只是与其他任何属性一样的普通属性,这就是为什么上述代码不会引发错误的原因) . 元类现在被定义为类的命名参数:
import abc
class ABC(metaclass=abc.ABCMeta):
@abc.abstractmethod
def foo(self):
return True
a = ABC()
Run Code Online (Sandbox Code Playgroud)
提出TypeError:
Traceback (most recent call last):
File "main.py", line 11, in
a = ABC()
TypeError: Can't instantiate abstract class ABC with abstract methods foo
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |