Как сделать наноразмерный класс в python - PullRequest
0 голосов
/ 05 августа 2020

Я хочу сделать класс таким, чтобы любое взаимодействие с его экземпляром возвращало другой экземпляр этого класса. Это будет похоже на то, как nans взаимодействуют с другими числами:

import numpy as np
np.nan + 3
Out[3]: nan

Но это применимо к любому python объекту:

nan_like + [3,2,1]
Out[4]: nan_like

, а также к любой операции:

nan_like[10]
Out[5]: nan_like

Лучшее, что я придумал до сих пор, это:

import numpy as np

class NanLike(np.lib.mixins.NDArrayOperatorsMixin):
    def __init__(self):
        pass
    
    def __getitem__(self, index):
        return NanLike()
    
    def __str__(self):
        return "NanLike"
    
    def __repr__(self):
        return "NanLike"
    
    def __call__(self, *args, **kwargs):
        return NanLike()

    def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
        return NanLike()
    
    def __array_function__(self, func, types, args, kwargs):
        return NanLike()




nan_like = NanLike()


print(nan_like + [3,2,1])

print(nan_like[10])

Что действительно ведет себя так, как я хочу. Но в моем приложении возможно, что у меня будет довольно много таких объектов. Это мудро? Я изучал возможность сделать его синглтоном, таким как объект None, но, похоже, существует сильная позиция против синглтонов, когда люди говорят, что необходимость в синглтоне является индикатором плохой архитектуры, и я не хочу, чтобы pu sh вперед, если то, что я пытаюсь сделать, по своей сути плохое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...