这本质上是一个语法糖问题,所以如果你不赞成在这种事情上付出努力,请不要再读了。
考虑以下不起作用的玩具示例:
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]
or选择一个单一的元素rows_or_cols[ci][ri]
。
什么不起作用是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
在这篇文章中,他们还建议使用元类。但是,我宁愿避免使用它们,因为我害怕元类冲突。
有什么建议(包括那些告诉我整件事一开始就是个愚蠢的想法的建议)?