在Python中工作时,如何通过一个实例化的类来检索由元类(元方法)拥有的方法?在下面的情况下,这很容易 - 只需使用
然而这很奇怪,因为在
getattr
或点符号:
* 所有示例都使用版本安全的with_metaclass
class A(type):
class A(type):
"""a metaclass"""
def method(cls):
m = "this is a metamethod of '%s'"
print(m % cls.__name__)
class B(with_metaclass(A, object)):
"""a class"""
pass
B.method()
# prints: "this is a metamethod of 'B'"
然而这很奇怪,因为在
dir(B)
中找不到 'method'
。由于这个事实,动态覆盖这样的方法变得困难,因为元类不在 super
的查找链中:class A(type):
"""a metaclass"""
def method(cls):
m = "this is a metamethod of '%s'"
print(m % cls.__name__)
class B(with_metaclass(A, object)):
"""a class"""
@classmethod
def method(cls):
super(B, cls).method()
B.method()
# raises: "AttributeError: 'super' object has no attribute 'method'"
那么,正确覆盖元方法的最简单方法是什么?我已经想出了自己的答案,但期待任何建议或替代答案。提前感谢您的回复。
__init__
中调用方法setup_class
。有一个基本的setup_class
功能,因此在元类上定义它并不完全不合适,但在遇到这个问题后,我意识到它同样可以在基类上定义。我很快会发布我的解决方案。感谢您清晰的回复。 - rmorshea__init__
返回之前调用的classmethod不能使用super
-请参见https://dev59.com/EGcs5IYBdhLWcg3wHwRH#28605694) - jsbueno