스택큐힙리스트

인수 유형에 따라 __init__ 메서드를 오버로드하는 방법은 무엇인가요? 본문

카테고리 없음

인수 유형에 따라 __init__ 메서드를 오버로드하는 방법은 무엇인가요?

스택큐힙리스트 2023. 4. 3. 05:32
반응형

우리가 가정하자면, 우리는 데이터라는 이름의 리스트를 가지고 있는 클래스를 갖는다.

나는 예를 들어, 초기화할 목록 데이터가 포함된 파일 이름이나 실제 목록으로 클래스를 초기화할 수 있기를 원합니다.

이것을 하는 데 사용하는 기술은 무엇인가요?

당신은 그냥 __class__을(를) 보고 유형을 확인합니까?

저가 놓치고 있는 요령이 있을까요?

나는 C++에서 인자 유형에 따른 오버로딩이 쉬워서 익숙합니다.

답변 1

'대체 생성자'를 얻는 훨씬 더 깔끔한 방법은 classmethod를 사용하는 것입니다. 예를 들어:

>>> class MyData:

... def __init__(self, data):

... Initialize MyData from a sequence

... self.data = data

...

... @classmethod

... def fromfilename(cls, filename):

... Initialize MyData from a file

... data = open(filename).readlines()

... return cls(data)

...

... @classmethod

... def fromdict(cls, datadict):

... Initialize MyData from a dict's items

... return cls(datadict.items())

...

>>> MyData([1, 2, 3]).data

[1, 2, 3]

>>> MyData.fromfilename(/tmp/foobar).data

['foo\n', 'bar\n', 'baz\n']

>>> MyData.fromdict({spam: ham}).data

[('spam', 'ham')]

그 이유는 어떤 형식이 예상되는지에 대해 불투명함이 없으며, 호출자가 당신에게 주어진 데이터 유형을 어떻게 처리해야 할지 추측할 필요가 없기 때문입니다. isinstance(x, basestring)의 문제점은 호출자가 유형이 기본 문자열이 아니더라도 문자열로 처리해야 한다는 것을 알리지 않을 수 있다는 것입니다 (다른 시퀀스가 아닙니다.). 또한 호출자는 동일한 유형을 다른 용도로 사용하고 싶어 할 수 있으며, 때로는 단일 항목으로, 때로는 항목 시퀀스로 사용합니다. 명시적임으로 인해 모든 의심과 혼란이 사라지고 더 견고하고 명확한 코드를 얻을 수 있습니다.

답변 2

__init__ 메소드를 arguement 타입에 따라 오버로드하는 방법은 매우 유용한 기술입니다. Python에서 __init__ 메소드는 객체를 초기화하기 위한 가장 기본적인 메소드입니다. 객체를 생성할 때 이 메소드를 호출하면 객체의 인스턴스 변수를 초기화하고 다른 초기화 작업을 수행할 수 있습니다.

그러나 만약 클래스에 여러 가지 인자 타입이 필요한 경우라면 어떻게 해야 할까요? 우리는 __init__ 메소드를 오버로드하여 이 문제를 해결할 수 있습니다. 이것은 클래스 내부에 여러 개의 __init__ 메소드를 만드는 것을 의미하며, 각각의 메소드는 서로 다른 인자 타입을 가집니다. 이렇게 하면 우리는 클래스 인스턴스를 생성할 때 argument의 타입에 따라 적절한 init 메소드가 호출되게 됩니다.

좀 더 구체적으로 설명해 보면, 예를 들어, 우리는 작성한 클래스가 integer, string 및 list를 인자로 받아야 한다고 가정해 봅시다. 이런 경우, 클래스의 __init__ 메소드를 int, str 및 list를 인자로 받는 다음과 같은 방법으로 작성할 수 있습니다.

```

class MyClass:

def __init__(self, num: int):

self.num = num

def __init__(self, string: str):

self.string = string

def __init__(self, lst: list):

self.lst = lst

```

이렇게하면 클래스 인스턴스를 생성할 때 각 인자의 타입에 따라 적절한 init 메소드가 호출되므로, 우리는 쉽게 클래스 객체를 초기화할 수 있습니다.

이러한 방식으로 __init__ 메소드를 알맞게 오버로드하면, 클래스를 더 쉽고 편리하게 사용할 수 있습니다. 이것은 특히 매우 복잡한 클래스에서 유용합니다. 따라서, 클래스 디자인에서 __init__ 메소드의 오버로딩은 중요한 역할을 합니다. 이러한 기술을 적용하면, Python을 사용하는 개발자들은 더욱 효율적인 코드를 작성하고 자신들의 작업을 더욱 간결하고 효율적으로 만들 수 있습니다.

반응형
Comments