如何在类vs实例上进行单调度

2024-10-05 14:22:05 发布

您现在位置:Python中文网/ 问答频道 /正文

这本质上是一个语法上的糖分问题,所以如果你不赞成把精力放在这类事情上,那就不要读下去了

考虑下面的玩具示例,它不起作用:

from functools import singledispatch

class rows_or_cols:
    _data = [[2,7,6],[9,5,1],[4,3,8]]
    def __init__(self, row_idx_or_col):
        self.data = row_idx_or_col if isinstance(row_idx_or_col, list) else \
                    self._data[row_idx_or_col]
    @singledispatch
    def __getitem__(self_or_cls, idx):
        return self_or_cls.data[idx]
    @__getitem__.register(type)
    @classmethod
    def _(cls, col_idx):
        return rows_or_cols([r[col_idx] for r in cls._data])
    def __repr__(self):
        return str(self.data)

我要做的是创建实例,包含_data中幻方的行或列,具体取决于我是使用rows_or_cols(idx)还是rows_or_cols[idx]。更复杂的是,我还希望__getitem__在实例上可用,因此我可以通过rows_or_cols(ri)[ci]rows_or_cols[ci][ri]选择sinlge元素

不起作用的是rows_or_cols[i]

a = rows_or_cols[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'type' object is not subscriptable

我想原因是这个https://stackoverflow.com/a/12447078/7207392

在本文中,他们还建议使用元类。但是,我更愿意避免它们,因为我害怕元类冲突

有什么建议吗(包括那些一开始就告诉我整件事都是个愚蠢的想法的建议)


Tags: orselfdatareturndeftypecol建议