Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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在不检查超类的情况下确定是否存在_Python - Fatal编程技术网

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