什么时候以及如何在 python 中使用静态方法?我们已经建立了使用类方法作为工厂方法来创建对象的实例,应该尽可能避免。换句话说,使用类方法作为替代构造函数并不是最佳实践(请参阅Python 对象的工厂方法 - 最佳实践)。
假设我有一个类用于表示数据库中的一些实体数据。想象一下,数据是一个dict
包含字段名称和字段值的对象,其中一个字段是使数据唯一的 ID 号。
class Entity(object):
def __init__(self, data, db_connection):
self._data = data
self._db_connection
在这里,我的__init__
方法采用实体数据dict
对象。假设我只有一个 ID 号,我想创建一个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)
还是使用独立函数从 ID 号中查找实体数据更有意义。
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 种不同的方法来查找实体数据,所以我更愿意在某种程度上保持逻辑分离。说得通?