Это вопрос о наилучшей практике создания экземпляра класса или типа из разных форм одних и тех же данных с использованием python. Лучше использовать метод класса или лучше вообще использовать отдельную функцию? Допустим, у меня есть класс, используемый для описания размера документа. (Примечание. Это просто пример. Я хочу узнать, как лучше всего создать экземпляр класса а не как лучше всего описать размер документа.)
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
Мой метод __init__
принимает значение размера, представленное в битах (биты и только биты, и я хочу оставить его таким), но допустим, что у меня есть значение размера в байтах, и я хочу создать экземпляр своего класса. Лучше использовать метод класса или лучше вообще использовать отдельную функцию?
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)
OR
def create_instance_from_bytes(bytes):
bits = bytes * Size.BYTE
return Size(bits)
Это может показаться не проблемой, и, возможно, оба примера верны, но я думаю об этом каждый раз, когда мне нужно реализовать что-то подобное. Долгое время я предпочитал метод класса, потому что мне нравятся организационные преимущества связывания класса и фабричного метода. Кроме того, использование метода класса сохраняет возможность создавать экземпляры любых подклассов, что делает его более объектно-ориентированным. С другой стороны, один друг однажды сказал: «Если сомневаешься, делай то, что делает стандартная библиотека», и мне еще предстоит найти пример этого в стандартной библиотеке.
bytes
; это встроенный тип (в 2.6 и более поздних версиях). - person abarnert   schedule 21.02.2013Size(bytes=20)
. Не делай, как я, делай, как я говорю. :) - person abarnert   schedule 21.02.2013bytes
отмечено должным образом. Спасибо что подметил это. - person Yani   schedule 21.02.2013