如何使用python中的父类检查子类的类型?

Posted

技术标签:

【中文标题】如何使用python中的父类检查子类的类型?【英文标题】:How to check type of a subclass using the parent class in python? 【发布时间】:2021-07-27 18:54:33 【问题描述】:

假设我有五个这样的类:

class Operator:
    def __init__(self):
        pass

class Pow(Operator):
    pass

class Mul(Operator):
    pass

class Div(Operator):
    pass

class Add(Operator):
    pass

class Sub(Operator):
    pass

还有一个标记数组,其中一些是数字,另一些是从 Pow, Mul, Div, Add, Sub 上面的类实例化的对象。

当我遍历数组时,我希望能够像这样检查令牌的类型:

for token in tokens:
    if type(token) is Operator:
        # do something

不要这样做:

for token in tokens:
    if type(token) in [Pow, Mul, Div, Add, Sub]:
        # do something

我不知道第二个 for 循环是否有好的替代方案。

(欢迎任何代码重构)

【问题讨论】:

【参考方案1】:

使用方法isinstance(token, Operator)

这里是例子

ar = Div()
if isinstance(ar, Operator):
    print("true")

【讨论】:

是否可以做类似token is Operatortoken == Operator 的事情? 不,命令 type() 返回类名(如 Div 等)。您可以通过以下方式使用issubclass 方法将其混合:if issubclass(type(token), Operator) 但其丑陋且与isinstance 相同。如果你需要==is,我想到的唯一方法就是做这样的事情token.__class__.__base__ == Operator_class__方法返回类(例如DIV),__base__返回父类。【参考方案2】:
for token in tokens:
    if isinstance(token, Operator):
        # do something

【讨论】:

以上是关于如何使用python中的父类检查子类的类型?的主要内容,如果未能解决你的问题,请参考以下文章

python 如何调用父类 的父类 的方法

Python入门精华-OOP调用父类的方法及MRO方法解析序列

无法访问kotlin子类中的父类变量

python2.7怎么查看类或对象的父类

我想通过Python中的子类对象调用在子类中被覆盖的父类方法

子类 catch 块会捕获已检查的父异常吗?