복붙노트

[PYTHON] 객체를위한 팩토리 메소드 - 모범 사례?

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)

또는

def create_instance_from_bytes(bytes):
    bits = bytes * Size.BYTE
    return Size(bits)

이것은 문제처럼 보이지 않을 수 있으며 아마도 두 예제 모두 유효합니다.하지만 이런 식으로 구현해야 할 때마다 생각합니다. 오랫동안 클래스와 팩토리 메서드를 함께 묶는 조직적 이점을 좋아하기 때문에 클래스 메서드 방식을 선호했습니다. 또한 클래스 메소드를 사용하면 모든 하위 클래스의 인스턴스를 생성 할 수 있으므로 객체 지향이 향상됩니다. 다른 한편, 한 친구가 "의심 스러울 때 표준 라이브러리가하는 일을하십시오."라고 말했고 아직 표준 라이브러리에서이 예를 찾을 수 없습니다.

해결법

  1. ==============================

    1.첫째, 대부분 당신이 이런 식으로 생각한다고 생각할 때, 그렇지 않습니다. 자바와 같이 파이썬을 다루려고한다는 신호입니다. 해결책은 물러서서 공장이 필요한 이유를 묻는 것입니다.

    첫째, 대부분 당신이 이런 식으로 생각한다고 생각할 때, 그렇지 않습니다. 자바와 같이 파이썬을 다루려고한다는 신호입니다. 해결책은 물러서서 공장이 필요한 이유를 묻는 것입니다.

    자주하는 가장 간단한 방법은 기본 / 선택적 / 키워드 인수를 사용하여 생성자를 만드는 것입니다. 심지어 Java로 작성하지 않더라도 C ++이나 ObjC에서 오버로드 된 생성자가 잘못 생각되는 경우조차도 Python에서는 완벽하게 자연스러워 보일 수 있습니다. 예를 들어 size = Size (bytes = 20) 또는 size = Size (20, Size.BYTES)가 적당합니다. 그 문제에 대해, Size에서 상속 받고 __init__ 오버로드를 절대적으로 추가하는 Bytes (20) 클래스는 합리적인 것처럼 보입니다. 그리고 이것들을 정의하는 것은 간단합니다.

    def __init__(self, *, bits=None, bytes=None, kilobits=None, kilobytes=None):
    

    또는:

    BITS, BYTES, KILOBITS, KILOBYTES = 1, 8, 1024, 8192 # or object(), object(), object(), object()
    def __init__(self, count, unit=Size.BITS):
    

    그러나 때로는 공장 기능이 필요합니다. 그래서, 당신은 무엇을합니까? 음, 종종 "공장"으로 묶여지는 두 가지 종류의 것들이 있습니다.

    @classmethod는 "대체 생성자"를 수행하는 관용적 인 방법입니다. stdlib-itertools.chain.from_iterable, datetime.datetime.fromordinal 등의 모든 예제가 있습니다.

    함수는 "나는 실제 클래스가 무엇인지 신경 쓰지 않는다"라는 관용적 인 방법이다. 예 : 내장 된 공개 기능을 확인합니다. 그것이 3.3에서 무엇을 반환하는지 알고 있습니까? 상관 없니? 아니. 그것이 함수가 아닌 이유입니다. io.TextIOWrapper.open 또는 무엇이든간에.

    주어진 예제는 완벽하게 합법적 인 사용 사례처럼 보이고 "대체 생성자"bin에 매우 명확하게 들어 맞습니다 ( "추가 인수가있는 생성자"bin에 맞지 않는 경우).

  2. from https://stackoverflow.com/questions/14992474/factory-method-for-objects-best-practice by cc-by-sa and MIT license