Python确定是否isintance而不检查超类

时间:2017-10-22 17:16:54

标签: python

class A:
   pass

class B(A):
   pass

如何在不引用var的情况下检查BA的实例,而不是A。我有大约50个类,它们是某些类的子类。我想检查实例是否是一个孩子。 类似于not isinstance(var, A)

有什么办法吗?

5 个答案:

答案 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")

供参考: