Как синглпатч на класс против экземпляра - PullRequest
0 голосов
/ 17 июня 2019

По сути, это синтаксический вопрос о сахаре, так что, если вы не одобряете усилия для такого рода вещей, не читайте дальше.

Рассмотрим следующий игрушечный пример, который не работает:

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__ был доступен в экземплярах, поэтому я могу выбрать элемент sinlge с помощью rows_or_cols(ri)[ci] или 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

В этом посте они также предлагают использовать метакласс. Однако я предпочел бы избегать их, потому что боюсь конфликтов метаклассов.

Любые рекомендации (в том числе те, которые говорят мне, что все это глупая идея)?

...