Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python“;isinstance“;使用类名而不是类型_Python - Fatal编程技术网

Python“;isinstance“;使用类名而不是类型

Python“;isinstance“;使用类名而不是类型,python,Python,我想检查对象或变量是否是指定类类型的实例,但使用的是该类的名称,而不是其类型。大概是这样的: class A: pass class B(A): pass class C(B): pass c_inst = C() # Not working, isinstance expects the type: ok = isinstance(c_inst, 'A') 还有其他选择吗?我不想使用类名,因此在这种情况下,isinstance(c_inst,A)不可用。如果类名仅作为字符串,则可以这

我想检查对象或变量是否是指定类类型的实例,但使用的是该类的名称,而不是其类型。大概是这样的:

class A: pass

class B(A): pass

class C(B): pass

c_inst = C()

# Not working, isinstance expects the type:
ok = isinstance(c_inst, 'A')

还有其他选择吗?我不想使用类名,因此在这种情况下,
isinstance(c_inst,A)
不可用。

如果类名仅作为字符串,则可以这样做

>类Foo:pass
... 
>>>foo=foo()
>>>foo.\uuuuu类\uuuuu.\uuuuuu名称\uuuuuuu=='foo'
真的
>>>foo.\uuuuu类\uuuuu.\uuuuuu名称\uuuuuu=='Bar'
假的
但是,这不是很可靠,因为
Foo.\uuuuuu类\uuuuu.\uuuuuu名称\uuuuuuu
是可写的

>>foo.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
>>>foo.\uuuuu类\uuuuu.\uuuuuu名称\uuuuuuu=='foo'
假的
对于超类,您可以执行以下操作

foo.__class__.__name__ = 'X' or 'X' in {c.__name__ for c in foo.__class__.__bases__}

虽然这不会拾取
对象

以这种方式产生的,但请注意:您正在检查的类必须位于globals中,尽管:

import inspect

def isinstance_string(variable, string):
    cls = globals().get(string, None)
    class Unused:
        pass
    cls = cls or Unused
    if inspect.isclass(cls):
        return isinstance(variable, cls)
    return False

class A: pass

class B(A): pass

class C(B): pass

c_inst = C()
ok = isinstance_string(c_inst, 'A')