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__
일하다.
isinstance
Python의 duck 타이핑으로 인해 실제로 어떤 오브젝트가 전달되었는지 파악하기 어렵기 때문에 피하는 것이 가장 좋습니다.예를 들어 파일 이름 또는 파일 유사 개체를 사용할 수 없습니다.isinstance(arg, file)
서브클래스를 하지 않는 파일형 오브젝트가 많기 때문에file
(urlib 또는 String에서 반환된 것과 같은 것)I/O 또는...)통상, 다른 키워드 인수를 사용하고, 발신자에게 오브젝트의 종류를 명확하게 전달하도록 하는 것이 좋습니다.
입력한 예에서는 기본값을 사용합니다.
class City:
def __init__(self, name="Default City Name"):
...
...
일반적으로 다음 두 가지 옵션이 있습니다.
하다
if
-elif
다음 유형에 따른 블록:def __init__(self, name): if isinstance(name, str): # todo elif isinstance(name, City): # todo # todo
duck 타이핑을 사용합니다.즉, 클래스 사용자가 올바르게 사용할 수 있을 정도로 지능적이라고 가정합니다.이것은 일반적으로 권장되는 옵션입니다.
>>> 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
'programing' 카테고리의 다른 글
React에서 중첩된 상태 특성을 업데이트하는 방법 (0) | 2022.10.08 |
---|---|
mysql의 float(2,2)와 float()의 차이 (0) | 2022.10.08 |
PHP - SSL 인증서 오류: 로컬 발급자 인증서를 가져올 수 없습니다. (0) | 2022.10.08 |
콤마가 있는 문자열을 배열로 변환 (0) | 2022.10.08 |
Java: 와의 차이점은 무엇입니까? (0) | 2022.10.08 |