【发布时间】:2026-02-03 22:45:01
【问题描述】:
我有以下python3代码:
class BaseTypeClass(type):
def __new__(cls, name, bases, namespace, **kwd):
result = type.__new__(cls, name, bases, namespace)
print("creating class '{}'".format(name))
return result
def __instancecheck__(self, other):
print("doing instance check")
print(self)
print(other)
return False
class A(metaclass=BaseTypeClass):
pass
print(type(A))
print(isinstance(A(), A))
当我在 Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32 上运行它时,我得到以下输出
creating class 'A'
<class '__main__.BaseTypeClass'>
True
为什么不输出doing instance check? documentation 表示需要在元类而不是类本身上定义 __instancecheck__ 方法,我在这里已经完成了。我什至验证了自从打印了creating class 'A' 以来正在使用元类。但是,当我调用 isinstance 时,它似乎使用的是默认实现,而不是我在元类中定义的实现。
我可能没有正确使用元类,但我不知道我在哪里犯了错误。
【问题讨论】:
-
让我们尝试解决这个“实施细节”...
-
作为一个奇怪的旁注,如果您将
__instancecheck__定义为普通类的方法,则该类的实例可以用作isinstance的第二个参数
标签: python python-3.x class python-3.6 metaclass