我最近开发了一个以DocumentWrapperPython中的一些ORM文档对象命名的类,以透明地向其添加一些功能,而无需以任何方式更改其接口.
我只有一个问题.假设我有一些User包裹在其中的对象.调用isinstance(some_var, User)将返回,False因为some_var确实是一个实例DocumentWrapper.
有没有办法伪造Python中的对象类型以获得相同的调用返回True?
我有以下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))
Run Code Online (Sandbox Code Playgroud)
当我运行它时,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
Run Code Online (Sandbox Code Playgroud)
为什么不输出doing instance check?该文件说,__instancecheck__方法需要在元类,而不是类本身,这是我在这里做定义.我甚至验证了自creating class 'A'打印以来正在使用的元类.但是,当我调用isinstance它时似乎使用默认实现而不是我在元类中定义的实现.
我可能没有正确使用元类,但我无法弄清楚我犯了哪些错误.