저는 C# 구문에 익숙합니다. 예를 들어 List<string> MyList
으로 문자열 목록을 만듭니다.Python 2.5에서 "형식화 된"목록 만들기
파이썬에서 콜렉션 유형에없는 유형을 추가하려고하면 비슷한 구문이 실패합니다.
저는 C# 구문에 익숙합니다. 예를 들어 List<string> MyList
으로 문자열 목록을 만듭니다.Python 2.5에서 "형식화 된"목록 만들기
파이썬에서 콜렉션 유형에없는 유형을 추가하려고하면 비슷한 구문이 실패합니다.
는, 파이썬은 내장처럼 아무것도하지 않습니다.
당신이 그런 일을하고 싶었다면, 당신은 허용 내장에 list()
클래스 및 수 있도록 모든 방법을 서브 클래스 것 요소를 삽입하거나 추가하면 형식 검사가 수행됩니다. 또는 형식 검사 대신 사용자 지정 메서드가 형식을 강제 변환하도록 만들 수 있습니다.
다음은 int()
값만 보유 할 목록의 구현 예입니다. 삽입하거나 추가하려고하는 모든 것을 강요하고 적절한 오류를 발생시킵니다. 내가 내장 된 서브 타입 list()
, 그래서 내가 쓴 코드는 단지 예외입니다; 여기에 표시되지 않은 항목은 기본 list()
유형과 정확히 일치합니다. 방금 몇 가지 방법을 사용해야했습니다. 또한 목록이나 다른 시퀀스를 받아들이고 객체를 초기화하는 사용자 정의 .__init__()
메소드를 제공했습니다.
이것은 불완전한 구현입니다. 예를 들어 .insert()
메서드를 재정의하지 않습니다. 하지만 기본 생각을 보여줄 것이라고 생각합니다. 실제로 IntList()
클래스를 원한다면이 클래스를 기본 클래스로 사용할 수 있습니다.
class IntList(list):
def __init__(self, seq=None):
if seq is not None:
try:
for x in seq:
self.append(int(x))
except ValueError:
raise ValueError, "can only use int values to init IntList"
def __setitem__(self, i, x):
try:
list.__setitem__(self, i, int(x))
except ValueError:
raise ValueError, "can only set int values into IntList"
def append(self, x):
try:
list.append(self, int(x))
except ValueError:
raise ValueError, "can only append int values to IntList"
lst = [0, 1, 't']
try:
o = IntList(lst) # raises exception
except ValueError:
print("lst has a 't' in it")
o = IntList(range(3)) # works
try:
o[1] = 't'
except ValueError:
print("cannot set to 't'")
o[1] = 2 # works
o.append(4) # works
o.append('t') # raises error
위의 인쇄 :
lst has a 't' in it
cannot set to 't'
Traceback (most recent call last):
File "t.py", line 38, in <module>
o.append('t') # raises error
File "t.py", line 18, in append
raise ValueError, "can only append int values to IntList"
ValueError: can only append int values to IntList
.__init__()
기능의 목록 인수 None
로 설정된 기본 인수를 갖는 일반적인 파이썬 관용구가 있습니다. 이는 디폴트 값 목록이 컴파일 타임에 한 번만 평가되고이 목록에 대한 참조 저장은 해당 클래스의 모든 인스턴스가 동일한 인스턴스를 공유한다는 것을 의미하기 때문입니다. 이 경우, 우리는 루프를 반복하면서 루프를 반복하고, 우리 자신의 복사본을 만들었 기 때문에 실제로이 관용구를 할 필요가 없다. 그러나 나는 이것을 읽는 초보자를 위해 이디엄의 예를 보여주고 싶었다.
아니요. __*item__()
methods을 적절하게 구현하는 사용자 지정 클래스를 만들어야합니다. 다른 사람이 말했듯이
저는 여전히 파이썬 학습자입니다. __ * item __() 메소드를 실제로 사용하는 예제가 있습니까? (특히 Google 애플 리케이션 엔진에서 일하고 있기 때문에 Python 2.5를 사용) –
위의 대답에서 "방법"이라는 단어를 클릭 해보십시오. 이것은 파이썬 문서 페이지에 대한 링크입니다. – steveha
사용자 지정 클래스를 만들어야합니다. 이러한 기능은 Python에 존재하지 않습니다. – NullUserException
이것은 파이썬 방식이 아닙니다. 이것이 코드에서 내부적으로 사용된다면, 문자열 이외의 것을리스트에 넣지 마십시오. 이것이 당신이 쓰고있는 모듈의 사용자에게 드러내는 것이라면, 올바르게 문서화하십시오. 이 방법은 문자열처럼 작동하지만 반드시 문자열 일 필요는없는 모든 것을 포함 할 수 있습니다. 자세한 정보는 "duck typing"및 EAFP를 참조하십시오. – yak