programing

Python에서는 여러 컨스트럭터를 정의할 수 없습니까?

goodcopy 2022. 10. 8. 22:54
반응형

Python에서는 여러 컨스트럭터를 정의할 수 없습니까?

중복 가능성:
Python에서 여러 컨스트럭터를 사용할 수 있는 깨끗하고 비토닉한 방법은 무엇일까요?

Python에서는 시그니처가 다른 여러 컨스트럭터를 정의할 수 없습니까?그렇지 않다면, 그것을 피하는 일반적인 방법은 무엇입니까?

예를 들어 클래스를 정의한다고 가정해 보겠습니다.City.

저는 이렇게 말하고 싶습니다.someCity = City()또는someCity = City("Berlin")여기서 첫 번째는 기본 이름 값만 지정하고 두 번째는 기본 이름 값을 정의합니다.

Java와 달리 여러 생성자를 정의할 수 없습니다.다만, 디폴트값이 전달되지 않는 경우는, 디폴트치를 정의할 수 있습니다.

def __init__(self, city="Berlin"):
  self.city = city

시그니처가 인수의 에서만 다른 경우 기본 인수를 사용하는 것이 올바른 방법입니다.만약 당신이 다른 종류의 논쟁을 통과하고 싶다면, 나는 피하려고 노력할 것이다.isinstance-based 접근법은 다른 답변에서 언급되며 대신 키워드 인수를 사용합니다.

키워드 인수만 사용하는 것이 어려워지면 클래스 메서드와 조합할 수 있습니다(bzrlib 코드는 이 접근방식을 좋아합니다).이것은 단지 어리석은 예에 불과하지만, 여러분이 이해하기를 바랍니다.

class C(object):

    def __init__(self, fd):
        # Assume fd is a file-like object.
        self.fd = fd

    @classmethod
    def from_filename(cls, name):
        return cls(open(name, 'rb'))

# Now you can do:
c = C(fd)
# or:
c = C.from_filename('a filename')

모든 클래스 메서드는 여전히 동일하게 처리됩니다.__init__단, 클래스 메서드를 사용하는 것이 키워드 인수의 조합을 기억하는 것보다 훨씬 편리할 수 있습니다.__init__일하다.

isinstancePython의 duck 타이핑으로 인해 실제로 어떤 오브젝트가 전달되었는지 파악하기 어렵기 때문에 피하는 것이 가장 좋습니다.예를 들어 파일 이름 또는 파일 유사 개체를 사용할 수 없습니다.isinstance(arg, file)서브클래스를 하지 않는 파일형 오브젝트가 많기 때문에file(urlib 또는 String에서 반환된 것과 같은 것)I/O 또는...)통상, 다른 키워드 인수를 사용하고, 발신자에게 오브젝트의 종류를 명확하게 전달하도록 하는 것이 좋습니다.

입력한 예에서는 기본값을 사용합니다.

class City:
    def __init__(self, name="Default City Name"):
        ...
    ...

일반적으로 다음 두 가지 옵션이 있습니다.

  1. 하다if-elif다음 유형에 따른 블록:

    def __init__(self, name):
        if isinstance(name, str):
            # todo 
        elif isinstance(name, City):
            # todo 
        # todo 
    
  2. duck 타이핑을 사용합니다.즉, 클래스 사용자가 올바르게 사용할 수 있을 정도로 지능적이라고 가정합니다.이것은 일반적으로 권장되는 옵션입니다.

M.의 답은 정확하다.다음과 같이 합니다.

>>> class City:
...     def __init__(self, city=None):
...         self.city = city
...     def __repr__(self):
...         if self.city:  return self.city
...         return ''
...
>>> c = City('Berlin')
>>> print c
Berlin
>>> c = City()
>>> print c

>>>

가장 쉬운 방법은 키워드 인수를 사용하는 것입니다.

class City():
  def __init__(self, city=None):
    pass

someCity = City(city="Berlin")

이건 아주 기본적인 거야.Python 문서를 보시겠습니까?

언급URL : https://stackoverflow.com/questions/2164258/is-it-not-possible-to-define-multiple-constructors-in-python

반응형