class A:
pass
class B(A):
pass
如何在不引用var
的情况下检查B
是A
的实例,而不是A
。我有大约50个类,它们是某些类的子类。我想检查实例是否是一个孩子。
类似于not isinstance(var, A)
。
有什么办法吗?
答案 0 :(得分:0)
所以我假设B
执行A
无法做到的特定事情。即它有A
没有的方法。因此,检查实例来自B
的一种方法是使用以下方法。
if hasattr(my_instance, 'method_name_particular_to_b'):
# do this
这将检查my_instance
上是否存在该方法。您可以将其视为B
中的实例,否则将其视为A
中的实例。
答案 1 :(得分:0)
使用isinstance
并判断特定变量var
是否是子类或超类的实例非常困难。你实际上可以做的是指定一个特殊属性__class__
,它可以告诉你实例的类。
例如:
class A:
@property
def __class__(self):
return '__main__.A'
class B(A):
@property
def __class__(self):
return '__main__.B'
b = B()
a = A()
print b.__class__
> '__main__.B'
print a.__class__
> '__main__.A'
但是,如果您使用class A
继承object
,则可以在不指定这些属性的情况下检查行为。
class A(object):
pass
class B(A):
pass
b = B()
a = A()
print b.__class__
> '__main__.B'
print a.__class__
> '__main__.A'
PS:我提到this所以问题虽然是在Java中
答案 2 :(得分:0)
不优雅,但似乎有效:not var.__class__.__name__=='A'
答案 3 :(得分:0)
您可以使用range-v3
找到实例的类型。
__class__
会为您提供特定类型的对象。
答案 4 :(得分:0)
isinstance(object, classinfo)
检查对象是否是作为第二个参数给出的类的实例(或子类)。
type(object)
返回对象的确切类型。
因此,您可以检查对象是A
的子类的实例,而不是A
本身,您可以执行以下操作。
if isinstance(obj, A) and not type(obj) == A:
print("is subclass of A")
else:
print("is either A or completely unrelated")
供参考: