Возврат определенного атрибута класса по вызову экземпляра класса (переменой)

Рейтинг: 0Ответов: 2Опубликовано: 02.08.2023
class PythonClass:
    def __init__(self):
        self.__some_dict = {"key_1": 12}


inst_1 = PythonClass()
json.dumps(inst_1)  # >> Должен возвращaться словарь "inst_1.__some_dict"

Вместо объекта переменой должен возвращаться __some_dict , а не объект класса. Есть ли метод или какая-нибудь тонкость для данной реализации? Иначе не могу масштабировать проект без переписывания тонны кода.

Ответы

▲ 1

Ну, можно, конечно, вот так сделать:

class PythonClass:
    def __new__(cls):
        return {"key_1": 12}


inst_1 = PythonClass()
print(inst_1)

Это будет именно то, о чём вы спрашиваете, - класс, который при инстанцировании создаёт словарь, вместо объекта класса.

Но я бы порекомендовал обратить внимание на вариант из комментов - функцию, которая просто имеет имя, как у вашего класса:

def PythonClass():
    return {"key_1": 12}


inst_1 = PythonClass()
print(inst_1)

Либо, если задача именно в том, чтобы объект класса мог сериализоваться в json, то можно написать кастомный энкодер:

# Мы не меняем реализацию самого класса
class PythonClass:
    def __init__(self):
        self.__some_dict = {"key_1": 12}


inst_1 = PythonClass()


# Вместо этого мы делаем энкодер, который знает, как сериализовать наш класс в словарь
import json


class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, PythonClass):
            return obj._PythonClass__some_dict
        return json.JSONEncoder.default(self, obj)


# И используем этот декодер для сериализации в json
dumped = json.dumps(inst_1, cls=CustomEncoder)
print(dumped)
▲ 0
def __dict__(self):
    return self.__some_dict

__dict__ - магическая функция, которая выполняется, когда к объекту пытаются обратиться как к словарю (преобразовать в словарь в нашем случае)