Khi nào và làm thế nào các phương pháp tĩnh giả sử được sử dụng trong python? Chúng ta đã thiết lập sử dụng một phương thức lớp làm phương thức factory để tạo một thể hiện của một đối tượng cần tránh khi có thể. Nói cách khác, cách tốt nhất là không nên sử dụng các phương thức lớp như một phương thức khởi tạo thay thế (xem Factory method for python object - best practice).Sử dụng các phương pháp tĩnh trong python - thực hành tốt nhất
Cho phép nói rằng tôi có một lớp được sử dụng để đại diện cho một số dữ liệu thực thể trong cơ sở dữ liệu. Hãy tưởng tượng dữ liệu là một đối tượng dict
có chứa tên trường và giá trị trường và một trong các trường là số ID làm cho dữ liệu duy nhất.
class Entity(object):
def __init__(self, data, db_connection):
self._data = data
self._db_connection
Ở đây phương pháp __init__
tôi mất dữ liệu đối tượng dict
đối tượng. Cho phép nói rằng tôi chỉ có một số ID và tôi muốn tạo ra một ví dụ Entity
. Trước tiên, tôi sẽ cần phải tìm phần còn lại của dữ liệu, sau đó tạo một thể hiện của đối tượng Entity
của tôi. Từ câu hỏi trước của tôi, chúng tôi đã thiết lập rằng việc sử dụng phương pháp lớp học làm phương pháp nhà máy có lẽ nên tránh khi có thể.
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)
Trên đây là ví dụ về những việc không nên làm hoặc ít nhất là không nên làm gì nếu có giải pháp thay thế. Bây giờ tôi tự hỏi nếu chỉnh sửa phương pháp lớp của tôi để nó là nhiều hơn một phương pháp tiện ích và ít hơn của một phương pháp nhà máy là một giải pháp hợp lệ. Nói cách khác, ví dụ sau có tuân thủ phương pháp hay nhất để sử dụng các phương pháp tĩnh hay không.
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)
Hoặc sử dụng chức năng độc lập có ý nghĩa hơn để tìm dữ liệu thực thể từ số 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)
Lưu ý: Tôi không muốn thay đổi phương pháp __init__
của mình. Trước đây mọi người đã đề xuất làm cho phương pháp __init__
của tôi trông giống như thế này __init__(self, data=None, id_number=None)
nhưng có thể có 101 cách khác nhau để tìm dữ liệu thực thể vì vậy tôi muốn giữ logic đó tách biệt ở một mức độ nào đó. Có lý?
Tên của câu hỏi này và câu giới thiệu làm cho âm thanh như bạn đang đào vì lý do sử dụng các tính năng ngôn ngữ, thay vì cố gắng tìm ra đúng cách để viết mã bạn muốn. Tôi không nói đó là những gì bạn đang làm (cơ thể thực sự của câu hỏi của bạn chắc chắn là một câu hỏi thực sự, hợp lệ). Chỉ cần bạn có thể nghĩ một chút về cách nói của bạn. Bằng cách này, bạn chỉ có thể nhận được câu trả lời từ những người thích tranh luận về các tính năng ngôn ngữ, chứ không phải là nhóm người viết nhiều Python tốt hơn nhiều. – abarnert