[英]Python “isinstance” with class name instead of type
我想检查 object 或变量是否是指定 class 类型的实例,但使用此 class 的名称,而不是其类型。 像这样的东西:
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')
有没有其他选择? 我想使用 class 名称,因此在这种情况下isinstance(c_inst, A)
不可用。
如果您只有 class 名称作为字符串,您可以这样做
>>> class Foo:pass
...
>>> foo = Foo()
>>> foo.__class__.__name__ == 'Foo'
True
>>> foo.__class__.__name__ == 'Bar'
False
然而这不是很可靠,因为Foo.__class__.__name__
是可写的
>>> foo.__class__.__name__ = 'Baz'
>>> foo.__class__.__name__ == 'Foo'
False
对于超类,你可以做类似的事情
foo.__class__.__name__ = 'X' or 'X' in {c.__name__ for c in foo.__class__.__bases__}
虽然这不会拿起object
。
想出了这种方式,请注意:您正在检查的 class 必须在全局变量中:
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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.