【问题标题】:Matching an instance most specific class in python匹配python中最具体的类的实例
【发布时间】:2021-12-28 00:46:25
【问题描述】:

假设我有三个类ABCC 扩展BB 扩展A

@dataclass
class A:
    value: int

class B(A):
    pass

class C(B):
    pass

在引入 match 功能的 python 3.10 中,我考虑将 isinstance-elif 语句更改为 match-case 语句。但我找不到合适的语法...

到目前为止我已经尝试过什么......

match instance.__class__.__name__:
    case A.__name__:
        print('A')
    case B.__name__:
        print('B')

但是如果两个类有相同的__name__ 属性会怎样。在这里,即使是 C 实例也不会匹配任何情况。

下一个语法...这个更好

match instance:
    case A():
        print('A')
    case B():
        print('B')

这种语法效果很好,除了 B 实例将匹配第一种情况,因此我需要在我的 match-case 语句中对类进行拓扑排序。

附加问题:这是一种不需要参数的特殊语法吗?

问题:我还有哪些其他选择?

【问题讨论】:

    标签: python python-3.10


    【解决方案1】:

    如果你想获取实例的父类,你可以这样做 instance.__class__.__bases__[0] __bases__ 返回一个带有父类的元组。


    我尝试使用 match 语句,但收到以下警告:

    match instance.__class__.__bases__[0]:
        case A:  # makes remaining clause unreachable
            print('A')
        case ...
    

    改用A().__class__ 会产生另一个错误。“意外令牌”


    尽管如此,C().__class__.__bases__[0] == B 的结果为 True。

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 2017-04-25
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      相关资源
      最近更新 更多