Python在不检查超类的情况下确定是否存在
我如何检查Python在不检查超类的情况下确定是否存在,python,Python,我如何检查var是否是B的实例,而不是A,而不引用A。我有大约50个类,它们是某个类的子类。我想检查实例是否为子实例。 类似于而不是isinstance(var,A) 有什么办法吗?所以我假设B做了A做不到的事情。Ie它有一个a没有的方法。因此,检查实例是否来自B的一种方法是使用以下命令 class A: pass class B(A): pass 这将检查myu实例上是否存在该方法。您可以将其视为B中的实例,否则将其视为A中的实例 很难使用isinstance来判断特定变量va
var
是否是B
的实例,而不是A
,而不引用A
。我有大约50个类,它们是某个类的子类。我想检查实例是否为子实例。
类似于而不是isinstance(var,A)
有什么办法吗?所以我假设
B
做了A
做不到的事情。Ie它有一个a
没有的方法。因此,检查实例是否来自B
的一种方法是使用以下命令
class A:
pass
class B(A):
pass
这将检查
myu实例上是否存在该方法。您可以将其视为B
中的实例,否则将其视为A
中的实例 很难使用isinstance
来判断特定变量var
是子类还是超类的实例。实际上,您可以指定一个特殊属性\uuuuu class\uuuu
,它可以告诉您实例的类
例如:
if hasattr(my_instance, 'method_name_particular_to_b'):
# do this
但是,如果使用object
继承class A
,则可以在不指定这些属性的情况下检查行为
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'
PS:我提到了这样一个问题,虽然它在Java中不优雅,但似乎很有效:不是var.\uuuu class\uuuu.\uuu name\uuuuu='A'
您可以使用\uuu class\uuuuu>找到实例的类型
var.\uuuuu class\uuuuuu
将为您提供对象的特定类型。isinstance(object,classinfo)
检查对象是否是作为第二个参数给定的类的实例(或子类)
type(object)
返回对象的确切类型
因此,您可以检查对象是否是a
的子类的实例,而不是a
本身,您可以执行以下操作
class A(object):
pass
class B(A):
pass
b = B()
a = A()
print b.__class__
> '__main__.B'
print a.__class__
> '__main__.A'
供参考:
B
,或者A
的任何子类?(如果A
的任何子类,您为什么要避免显式引用A
)也许您可以尝试查看变量。\uuuu mro\uuuu
为什么不引用A
?请澄清。对我来说,不太清楚您是否要检查它是B
的实例,还是从A
派生的任何类的实例(但不是A
本身)。“不引用A
”有什么意义?您是否考虑过将A
实现为一个抽象基类?为什么不type(x)是一个
?@user2357112不起作用。如果var=B()
,不存在(var,A)
返回False
@pstatix:Bleh,右。我在那里搞混了。应该是var.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvar.uuu class_uuu不是专门检查子类并拒绝超类和无关类的
)
if isinstance(obj, A) and not type(obj) == A:
print("is subclass of A")
else:
print("is either A or completely unrelated")