我正在阅读官方python documentation。
在上面提到的链接中,第二行说明:
使用此装饰器要求类的元类是ABCMeta或 源自它。
但是,我成功地定义了下面给出的类。
var parametersDisplay = db.utilisations_parametres_affichages.Where(o => o.utpar_clie_id == originalClientId).ToList();
foreach (var parameterDisplay in parametersDisplay)
{
parameterDisplay.utpar_clie_id = copyClientId;
parameterDisplay.utpar_user_update = "Backoffice";
db.utilisations_parametres_affichages.Add(parameterDisplay); // <== Exception
db.SaveChanges();
}
所以,上面的代码工作得很好。 而且,我能够创建一个子类
from abc import abstractmethod
class A(object):
def __init__(self):
self.a = 5
@abstractmethod
def f(self):
return self.a
a = A()
a.f()
不覆盖上面定义的抽象方法。
所以,基本上这意味着如果我的基类class B(A):
def __init__(self):
super(B, self).__init__()
b = B()
b.f()
不是metaclass
(或从它派生),那么即使我有类,该类也不像抽象类它中的抽象方法?
这意味着,文档需要更清晰吗?
或者,这种行为是否有用,我错过了这一点。
答案 0 :(得分:4)
所以,基本上这意味着如果我的基类的元类不是 ABCMeta(或从中衍生出来),该类的行为不像 抽象类,即使我有一个抽象方法吗?
正确。
所有abstractmethod
都会使用__isabstractmethod__ = True
标记方法。 ABCMeta
完成所有实际工作。 Here是abstractmethod
的代码:
def abstractmethod(funcobj):
"""A decorator indicating abstract methods.
Requires that the metaclass is ABCMeta or derived from it. A
class that has a metaclass derived from ABCMeta cannot be
instantiated unless all of its abstract methods are overridden.
The abstract methods can be called using any of the normal
'super' call mechanisms.
Usage:
class C(metaclass=ABCMeta):
@abstractmethod
def my_abstract_method(self, ...):
...
"""
funcobj.__isabstractmethod__ = True
return funcobj