IT story

파이썬에서 여러 생성자?

hot-time 2020. 5. 11. 08:08
반응형

파이썬에서 여러 생성자? [복제]


가능한 중복 :
파이썬에서 여러 생성자를 갖는 깨끗하고 파이썬적인 방법은 무엇입니까?

다른 서명으로 파이썬에서 여러 생성자를 정의 할 수 없습니까? 그렇지 않다면 일반적인 문제 해결 방법은 무엇입니까?

예를 들어 클래스를 정의하고 싶다고 가정 해 봅시다. City

내가 말할 수 있도록하고 싶습니다 someCity = City()someCity = City("Berlin")에 첫 번째로 단지 기본 이름 값을 제공하고, 두 번째 정의하는 그 곳.


Java와 달리 여러 생성자를 정의 할 수 없습니다. 그러나 전달되지 않은 경우 기본값을 정의 할 수 있습니다.

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

당신의 서명이 만 다른 경우 수의 기본 인수를 사용하여 인수를 할 수있는 올바른 방법이다. 다른 종류 의 인수 를 전달 하려면 isinstance키워드 인수를 사용하는 대신 다른 답변에 언급 된 기반 접근법 을 피하려고합니다 . 키워드 인수를 사용하는 것이 다루기 어려워지면 클래스 메소드와 결합 할 수 있습니다 (bzrlib 코드는이 접근법을 좋아합니다). 이것은 어리석은 예이지만 아이디어를 얻길 바랍니다.

class C(object):

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

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

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

모든 클래스 메소드는 여전히 동일 __init__하지만 클래스 메소드를 사용하면 키워드 인수 조합을 기억하는 것보다 훨씬 편리 할 수 ​​있습니다 __init__.

isinstance파이썬의 오리 타이핑은 실제로 어떤 종류의 객체가 전달되었는지 파악하기 어렵 기 때문에 피하는 것이 가장 좋습니다. 예를 들어 파일 이름 또는 파일과 같은 객체를 가져 오려면 파일과 같은 객체 isinstance(arg, file)가 많기 때문에 사용할 수 없습니다 fileurllib 또는 StringIO에서 반환 된 것과 같은 하위 클래스가 아닙니다 . 일반적으로 호출자가 다른 키워드 인수를 사용하여 어떤 종류의 객체를 의미했는지 명시 적으로 알려주는 것이 좋습니다.


제공 한 예제의 경우 기본값을 사용하십시오.

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

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

1) 수행 if- elif유형에 따라 블록 :

def __init__(self, name):
    if isinstance(name, str):
        ...
    elif isinstance(name, City):
        ...
    ...

2) 덕 타이핑을 사용하십시오. 즉, 클래스의 사용자가 올바르게 사용하기에 충분히 지능적이라고 가정하십시오. 이것이 일반적으로 선호되는 옵션입니다.


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

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

someCity = City(city="Berlin")

This is pretty basic stuff, maybe look at the python docs?


Jack M. is right, do it this way:

>>> 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

>>>

참고URL : https://stackoverflow.com/questions/2164258/multiple-constructors-in-python

반응형