파이썬에서 여러 생성자? [복제]
다른 서명으로 파이썬에서 여러 생성자를 정의 할 수 없습니까? 그렇지 않다면 일반적인 문제 해결 방법은 무엇입니까?
예를 들어 클래스를 정의하고 싶다고 가정 해 봅시다. 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)
가 많기 때문에 사용할 수 없습니다 file
urllib 또는 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
'IT story' 카테고리의 다른 글
IIS 7, Windows 7에서 ASP.NET 4.0을 응용 프로그램 풀로 추가하는 방법 (0) | 2020.05.11 |
---|---|
특정 줄만 읽기 (0) | 2020.05.11 |
Eclipse에서 Javadoc 주석을 어떻게 생성 할 수 있습니까? (0) | 2020.05.11 |
jquery 하위 이벤트 상위 이벤트 트리거 (0) | 2020.05.11 |
Visual Studio 2010에서 파일을 빠르게 찾는 방법이 있습니까? (0) | 2020.05.11 |