Когда и как статические методы предполагают использовать в python? Мы уже установили, используя метод класса, поскольку метод factory для создания экземпляра объекта следует избегать, когда это возможно. Другими словами, не рекомендуется использовать методы класса в качестве альтернативного конструктора (см. Factory метод для объекта python - наилучшая практика).
Допустим, у меня есть класс, используемый для представления данных сущности в базе данных. Представьте, что это объект dict
, содержащий имена полей и значения полей, а одно из полей - идентификационный номер, который делает данные уникальными.
class Entity(object):
def __init__(self, data, db_connection):
self._data = data
self._db_connection
Здесь мой метод __init__
принимает объект данных объекта dict
. Допустим, у меня есть только идентификационный номер, и я хочу создать экземпляр Entity
. Сначала мне нужно будет найти остальную часть данных, а затем создать экземпляр моего объекта Entity
. Из моего предыдущего вопроса мы установили, что, по возможности, следует избегать использования метода класса как метода factory.
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)
Выше приведен пример того, что не делать или, по крайней мере, не делать, если есть альтернатива. Теперь мне интересно, редактирование моего метода класса, так что это больше полезный метод, а метод factory является допустимым решением. Другими словами, соответствует ли следующий пример наилучшей практике использования статических методов.
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 способ найти данные сущности, поэтому я предпочел бы сохранить эту логику отдельно. Есть смысл?