Đây là câu hỏi về cách thực hành tốt nhất để tạo một thể hiện của một lớp hoặc kiểu từ các dạng khác nhau của cùng một dữ liệu bằng cách sử dụng python. Tốt hơn là sử dụng một phương thức lớp hay tốt hơn là sử dụng một hàm riêng biệt hoàn toàn? Cho phép nói rằng tôi có một lớp được sử dụng để mô tả kích thước của một tài liệu. (Lưu ý: Đây chỉ đơn giản là một ví dụ tôi muốn biết cách tốt nhất để tạo ra một thể hiện của lớp không phải là cách tốt nhất để mô tả kích thước của một tài liệu..)Phương pháp nhà máy cho đối tượng python - thực hành tốt nhất
class Size(object):
"""
Utility object used to describe the size of a document.
"""
BYTE = 8
KILO = 1024
def __init__(self, bits):
self._bits = bits
@property
def bits(self):
return float(self._bits)
@property
def bytes(self):
return self.bits/self.BYTE
@property
def kilobits(self):
return self.bits/self.KILO
@property
def kilobytes(self):
return self.bytes/self.KILO
@property
def megabits(self):
return self.kilobits/self.KILO
@property
def megabytes(self):
return self.kilobytes/self.KILO
phương pháp __init__
tôi có một giá trị kích thước đại diện bằng bit (bit và chỉ bit và tôi muốn giữ nó theo cách đó) nhưng cho phép nói rằng tôi có một giá trị kích thước bằng byte và tôi muốn tạo một thể hiện của lớp của tôi. Tốt hơn là sử dụng một phương thức lớp hay tốt hơn là sử dụng một hàm riêng biệt hoàn toàn?
class Size(object):
"""
Utility object used to describe the size of a document.
"""
BYTE = 8
KILO = 1024
@classmethod
def from_bytes(cls, bytes):
bits = bytes * cls.BYTE
return cls(bits)
HOẶC
def create_instance_from_bytes(bytes):
bits = bytes * Size.BYTE
return Size(bits)
này không có vẻ như một vấn đề và có lẽ cả hai ví dụ có giá trị nhưng tôi nghĩ về nó mỗi khi tôi cần phải thực hiện một cái gì đó như thế này. Trong một thời gian dài, tôi đã ưa thích cách tiếp cận phương pháp lớp vì tôi thích các lợi ích của tổ chức khi kết hợp lớp và phương thức factory với nhau. Ngoài ra, bằng cách sử dụng một phương thức lớp bảo toàn khả năng tạo ra các cá thể của bất kỳ lớp con nào, do đó nó được định hướng nhiều đối tượng hơn. Mặt khác, một người bạn đã từng nói "Khi nghi ngờ, hãy làm những gì thư viện chuẩn làm" và tôi chưa tìm thấy một ví dụ về điều này trong thư viện chuẩn.
Mọi phản hồi được đánh giá cao.
Cheers
Tôi muốn lật một đồng xu. Hầu hết các thư viện python dường như thích các API thủ tục hơn, nhưng đó là vì chúng có nghĩa là được tiêu thụ theo một cách khác với mã có thể tái sử dụng bên trong mã nguồn của bạn. – millimoose
PS, không gọi biến 'byte'; đó là loại nội trang (trong phiên bản 2.6 trở lên). – abarnert
Và tất nhiên tôi chỉ nhận ra rằng tôi đã phạm sai lầm tương tự trong câu trả lời của tôi: 'Kích thước (byte = 20)'. Đừng làm như tôi làm, làm như tôi nói. :) – abarnert