Когда и как статические методы предполагают использовать в python? Мы уже установили метод класса, поскольку по возможности следует избегать использования фабричного метода для создания экземпляра объекта. Другими словами, не рекомендуется использовать методы класса в качестве альтернативного конструктора (см. Factory method for python object - best practice).Использование статических методов в python - лучшая практика
Допустим, у меня есть класс, используемый для представления данных сущности в базе данных. Представьте, что это объект dict
, содержащий имена полей и значения полей, а одно из полей - идентификационный номер, который делает данные уникальными.
class Entity(object):
def __init__(self, data, db_connection):
self._data = data
self._db_connection
Вот мой __init__
метод принимает данные сущности dict
объект. Допустим, у меня есть только идентификационный номер, и я хочу создать экземпляр Entity
. Сначала мне нужно будет найти остальную часть данных, а затем создать экземпляр моего объекта Entity
. Из моего предыдущего вопроса мы установили, что, по возможности, следует избегать использования метода класса как фабричного метода.
class Entity(object):
@classmethod
def from_id(cls, id_number, db_connection):
filters = [['id', 'is', id_number]]
data = db_connection.find(filters)
return cls(data, db_connection)
def __init__(self, data, db_connection):
self._data = data
self._db_connection
# Create entity
entity = Entity.from_id(id_number, db_connection)
Выше приведен пример того, что не следует делать или, по крайней мере, не делать, если есть альтернатива. Теперь мне интересно, редактирование моего метода класса, так что это скорее метод полезности, а метод фабрики - это допустимое решение. Другими словами, соответствует ли приведенный ниже пример наилучшей практике использования статических методов.
class Entity(object):
@staticmethod
def data_from_id(id_number, db_connection):
filters = [['id', 'is', id_number]]
data = db_connection.find(filters)
return data
# Create entity
data = Entity.data_from_id(id_number, db_connection)
entity = Entity(data)
Или имеет смысл использовать автономную функцию для поиска данных сущности из идентификационного номера.
def find_data_from_id(id_number, db_connection):
filters = [['id', 'is', id_number]]
data = db_connection.find(filters)
return data
# Create entity.
data = find_data_from_id(id_number, db_connection)
entity = Entity(data, db_connection)
Примечание: Я не хочу, чтобы изменить свой __init__
метод. Раньше люди предлагали сделать мой метод __init__
похожим на это __init__(self, data=None, id_number=None)
, но может быть 101 способ найти данные сущности, поэтому я бы предпочел сохранить эту логику в некоторой степени. Имеют смысл?
Название этого вопроса и вступительное предложение звучат так, как будто вы копаете по причинам использования языковых функций, вместо того, чтобы пытаться выяснить правильный способ написания кода, который вы хотите. Я не говорю, что это то, что вы делаете (фактическое тело вашего вопроса определенно является реальным, действительным вопросом). Просто вы должны немного подумать о своей фразировке. Таким образом, вы можете получать ответы только от людей, которым нравится обсуждать языковые функции, а не намного больше людей, которые пишут хороший Python. – abarnert