相关疑难解决方法(0)

如何用Python伪造类型

我最近开发了一个以DocumentWrapperPython中的一些ORM文档对象命名的类,以透明地向其添加一些功能,而无需以任何方式更改其接口.

我只有一个问题.假设我有一些User包裹在其中的对象.调用isinstance(some_var, User)将返回,False因为some_var确实是一个实例DocumentWrapper.

有没有办法伪造Python中的对象类型以获得相同的调用返回True

python types class wrapper

13
推荐指数
4
解决办法
7534
查看次数

为什么不调用__instancecheck__?

我有以下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它时似乎使用默认实现而不是我在元类中定义的实现.

我可能没有正确使用元类,但我无法弄清楚我犯了哪些错误.

python metaclass class python-3.x python-3.6

5
推荐指数
1
解决办法
268
查看次数

标签 统计

class ×2

python ×2

metaclass ×1

python-3.6 ×1

python-3.x ×1

types ×1

wrapper ×1