Rett-oo
@Rett-oo

Как вызвать метод класса без вызова экземпляра?

Подскажите пожалуйста, как возможно вызывать методы без вызова экземпляра класса?
Сейчас у меня реализована функция get_items_list(), она является @classmethod, но мне кажется я делаю это не совсем правильно, вызывая экземпляр внутри функции, но по другому переменные при инициализации не получить. Думал вынести их в атрибуты, но насколько это правильно делать?

На выходе хотелось бы иметь класс для работы с API(OzonRequester) методами, каждый метод (относящийся к запросу определённого API метода) которого можно будет вызывать без инициализации OzonRequester в других классах или модулях.

class OzonRequester(requests.Session):
    """Doc."""

    __API_KEY = os.getenv('MP_Api_Key_Ozon')
    __CLINET_ID = os.getenv('MP_Client_Id_Ozon')
    __slots__ = ['__token', '__client_id']

    def __init__(self) -> None:
        """Doc."""
        super().__init__()
        self.base_url = ozon_base_url
        self.__token = self.__API_KEY
        self.__client_id = self.__CLINET_ID
        self.headers.update({
            "Host": "api-seller.ozon.ru",
            "Content-Type": "application/json",
            "Client-Id": self.__client_id,
            "Api-Key": self.__token})

    @classmethod
    def get_items_list(cls):
        """Doc."""
        from config import ozon_items_list
        session = cls()
        headers = session.headers
        req_body = {"limit": 1000}

        response = session.post(urljoin(session.base_url, ozon_items_list),
                                               headers=headers,
                                               json=req_body)
  • Вопрос задан
  • 655 просмотров
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Обычно методы класса используются для объявления альтернативных конструкторов класса, так называемые factory methods. То есть класс метод обычно возвращает cls(*args, **kwargs) Вызывается просто MyClass.classmeth(*args, **kwargs)
Вот например в pandas (у тебя был вопрос, значит используешь библиотеку) есть класс DataFrame. Ты можешь создать экземпляр класса DataFrame(data) А можешь использовать методы класса для альтернативного метода создания экземпляра (из другой структруры) DataFrame.from_dict(some_dict) так вот from_dict это метод класса.
Метод класса он оперирует на уровне класса и не имеет доступа к экземпляру класса. Есть еще статические методы, это по сути python функция которая "связана с классом" но не имеет доступа не экземпляру не к классу.

В чем у тебя здесь смысл попытки использовать методы класса лично мне не понятно. Потому что обычно вызвав метод класса мы инициализируем экземпляр с динамически измененным (данным методом) состоянием класса. Например мы можем поменять значение атрибута класса. Вот тебе на скорую руку бесполезный пример.
class MyClass:
    currency = 'Dollar'
    
    def __init__(self, amaunt):
        self.amaunt = amaunt
        
    def __str__(self):
        return f'MyClass({self.amaunt, self.currency})'
    
    @classmethod
    def euro(cls, amount):
        cls.currency = 'Euro'
        return  cls(amount)
dollar = MyClass(100)
print(dollar)
euro = MyClass.euro(100)
print(euro)

Если снова вызовешь print(dollar), то он тебе выведет euro. Потому что атрибут класса общий для всех экземпляров оказался измененным.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы