type()과 isinstance()의 차이점은 무엇인가요?
이 두 코드 조각의 차이점은 무엇인가요? type()`을 사용합니다:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
isinstance()` 사용:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
1153
7
요약하십시오 콘텐트입니다 위해 다른 (이미 优秀!) ',' 에 대한 답을 이신스턴스 충족시켜 상속 (오버클로킹된 인스턴스입니다 an_ 인스턴스입니다 _is 파생 클래스 (base class, 고쳐주렴), 확인하는 동안 언약보다는 것은 '유형' (id) 의 하위 유형을 lc-fc 유형 및 it 수요를 거부됩니다 인스턴스들도 하위 클래스).
일반적으로 파이썬 코드에서 운영까지도 지원할 수 있는, 상속, 물론 (이후 상속 너무 나쁜 정지점을 사용한 제품을 사용하여 코드를 될 수 있다고 되어 있어!) '는 더 이상 이신스턴스 도왔으매' 나쁜 '유형의 때문에 id 검사를 완벽하게 상속을 지원합니다.
39, that 's not it& 이신스턴스' 는 것은 보다 그냥 # 39 의 확인, 마음을 good you-it& less bad 추상형데이터타입. 일반, 파이썬, 우선 솔루션, 오리, " typing" 등도 가깝다. 특정 원하는 유형을 사용하여 시도하시겠습니까 as 전송되었기 if 인수, 그것을 할 수 있는 '' / '예외' 를 제외한 모든 시도하시겠습니까 경우 발생할 수 있는 것은 사실 인수에 관심을 기술서임을 해당 유형의 (또는 다른 유형 중에 덕 소리를 it; -) '과' 조항을 제외한 다른 방법을 시도해 보는 것이다. (name. domain. 인수, if" " 있다. 일부 다른 전송되었기 유형용).
그러나 '' 는 매우 특별한 경우-a 배서스트링 만 사용할 수 있는 '이신스턴스 내장 유형' ('와' 모두 'str 배서스트링 유니코드' 클래스 ''). 문자열은 시퀀스에만 (루프, 그들을 슬라이스에 그들 위에 인덱스화할 수 있습니다.), 일반적으로 정렬할지 확장하지만 처리하지 " scalar"; # 39 의 types-it& 다소 린코브니나 (단, 상당히 잦은 览侩 荤례) 치료를 위해 모든 종류의 문장열 (그리고 아마도 유형, 즉, 다른 스칼라 수준들과 너회가 can& # 39, t loop) 의 한 가지 방법은, 모든 컨테이너입니다 (목록, 세트, 딕토스.) 다른 방법으로 배서스트링 '플러스' 와 ',' 이 관용구 () 는 다음과 같은 것이 전반적인 구조를 작업자쪽에서 실행하십시오 이신스턴스 수 있습니다.
That '배서스트링 말할 수 있다' 는 기본 Class_ _Abstract 정보기술 (it) 는 아무런 실질적인 (abc" ";) 로 존재하는 것이 아니라,, 주로 하위 클래스 기능을 사용할 수 있는 '이신스턴스 " marker"'. 이 개념은 분명히 한 만큼 커지고 있으며, 파이썬, PEP 3119 는 파이썬 2.6 ~ 3.0gb 시작으로 it 는 일반화 수락됨 및 구현되어 있습니다.
분명히 할 수 있으며, 종종 상식 PEP 를 대체하기 위한 덕 타이핑 할 수 있어 매우 큰 압력을 일반적으로는 (http://otl. [here] [2]). 그러나 최근 파이썬 버전을 제공하십시오 상식 구현된 못하며창조된 추가 자료: '이제 단순히 " 짓궂군요 이신스턴스' ('와' 아서브클레스), [인스턴스입니다] 파생 class". (특히, 모든 클래스에 registered" " 수 있습니다. 있는 ABC 도왔으매 것, 그 하위 클래스여야 인스턴스로 인스턴스입니다 ABC 로 표시). 상식 및 실제 클래스를 템플릿 메소드 추가 편의를 제공할 수 있습니다 아주 자연스러운 운행에서어떠한 애플리케이션과도 통해 디자인 패턴 (http://otl. here 및 here [[II 부]] 에 대한 자세한 DP, 일반적으로 두 가지 독립적인 및 파이썬, 특히 상식).
Abc 에서 제공하는 기본 역학 support 를 파이썬 2.6 http://schmidt. devlib. here; 그들의 3.1 버전, 매우 유사한 http://schmidt. devlib. here. 이 두 가지 버전, 표준 라이브러리 모듈에서는 [컬렉션] [7] (that& # 39 의 3.1 버전 2.6 매우 유사한 버전을 http://schmidt. devlib. [here] [8]) 은 여러 가지 유용한 상식.
이 질문에 대한 이러한 객체속성 보존할 목적으로 하는 게 상식 (초과 오버클로킹된 시각이 잘 드러나 더 자연스러운 종종 autostarttm DP 기능에 비해 같은 클래식 파이썬 대안으로 믹스인 클래스뿐만 [우저딕트.딕트미신] [9]) '이신스턴스 그들이 하는 것이 훨씬 더 매력적인' ('와' 아서브클레스) 및 보급 (파이썬 2.6 에서 및 진행하십시오) 복제된다 (be in 2.5 및 과거), 따라서 문자 확인 할 수 있는 반면, 평등, 연습 때보다 더욱 악화시키고 최근 파이썬 버전을 이미 used to be.
[2]: http://www.python.org/dev/peps/pep-3119/ # 상식 vs 덕 타이핑
[7]: http://docs.python.org/3.1/library/collections.html # 모듈에서는 컬렉션 [8]: http://docs.python.org/library/collections.html # 모듈에서는 컬렉션 [9]: http://docs.python.org/library/userdict.html = 우저딕트 # 우저딕트.딕트미신 강조표시할?
다음은 '인스턴스'가 '유형'이 할 수 없는 것을 달성하는 예입니다:
이 경우 트럭 객체는 Vehicle이지만 다음과 같은 결과를 얻을 수 있습니다:
즉,
isinstance
는 서브클래스에도 참입니다.또한 참조:
>. # 차이점을 이신스턴스 () '와' 유형 ' ()' 의 파이썬?
함께 타입 검사
하위 클래스 인스턴스 및 여러 가능한 기지를 사용할 수 있습니다.
반면 함께 타입 검사
전용 up1 유형: 참조되었습니다.
참고, '는' 보다 더 적합한 것으로 보인다.
수업은 때문에 싱글.
타입 검사 사용할 것을 다형성 (덕 타이핑) -
보통 치료할 수 있는 모든 형태의 단축시킵니다 운영까지도 인수만, 파이썬, 이 경우, 예상대로 객체에는 doesn& # 39, t 역할이 예상대로 부활시켜 적절한 오류:. 다형성, 소트트웨어용 덕 타이핑 이 알려져 있다.
위 코드를 작동됨 경우 우리 오리 인수는 것으로 수 있습니다. 따라서 우리는 다른 것들은 실제 통과될 수 있는 오리 의 하위 유형:
같이 일하는 또는 오리.
그리고 우리의 코드를 계속 작동합니다.
그러나 몇 가지 경우를 명시적으로 유형 검사 것이 바람직하다. 아마도 그 것을 다른 객체 유형에 함께 할 수 있습니다. 예를 들어, 마리의 개체를 구성할 수 있는 다테프라임 충스러웠으니 딕토스 net/ 또는 레코드는유지합니다. 이 경우 코드에 지시에요 가져오는 것은 어떤 유형의 주장을 제대로 감당할 수 있도록.
따라서 이 질문에 대답할 수 있습니다.
차이점을 이신스턴스 () '와' 유형 ' ()' 의 파이썬?
나를 보여줄 수 있도록 차이:
'유형'
말하도다 특정 기능을 유지하는 데 필요한 경우 특정 종류의 질문을 되돌려줍니다 비헤이비어를 인수 (구성자를 위한 공통 활용). 문자용 선택하면 다음과 같습니다.
만약 우리가 딕트 시도하시겠습니까 통과할 수 있는 '의 하위 클래스인 딕트' (아니라 우리가 할 수 있어야, /usr/stuff1/file we& # 39, re 검색되어야 lionbridge 코드 따를 것 같다. 리스코프 치환, 그 하위 유형에 대한 대체할 수 있습니다.) 의 코드 분리!:
더욱이 오류가!
'이신스턴스'
리스코프 치환! ',' 우리가 사용하는 신앙이니라 이신스턴스 지원할 수 있습니다.
'되돌려줍니다 오르데레디스 ([(& # 39, foo& # 39, & # 39, bar& # 39;), (& # 39, & # 39, # 39 buzz& fizz& # 39;;)])'
추상 기본 클래스
사실 우리가 할 수 있는 더 좋다. '컬렉션' 은 추상 베이스 클래스를 위한 최소한의 프로토콜뿐만 적용되는 각종. 우리는 단지 '의 경우, 다음, 그리고 우리의 코드' 프로토콜을 작성되지는 매핑에서는 우리가 할 수 있는 유연한 더욱 커집니다.
대한 설명:
>. 여러 클래스를 사용하여 견제하려는 데 사용할 수 있다는 점에 유의해야 합니다 유형 (A, B, C) '에서' 유형 (목표)
아뇨, 할 수 있지만, 여러 유형의 평등을 위한 테스트 그들위에 대신 사용할 수 있는 경우가 아니면 디렉토리에만 생산기지로 제어 흐름, 특히 이러한 유형:
'차이' 를 대체할 수 있는 이신스턴스 도래하도록하려하는, 다시 그 하위 클래스 속성 리스코프 치환 반응 없이 깨고, 부모에 대한 프로그램 () 로 알려져 있다.
그러나 더욱 너회의 종속물과의 및 don& 반전됩니다 # 39, 특정 유형을 확인할지 전혀 없다.
결론
때문에 대부분의 경우, 우리는 우리가 원하는 대체 하위 클래스 지원할 수 있는 '유형' 과 함께 '-' 이신스턴스 타입 검사 포지셔닝하십시오 타입 검사 피하고 싶어하는 경우가 아니라면 정말 클래스를 알아야 정확히까지 인스턴스입니다.
후자가 선호되는데, 서브클래스를 제대로 처리할 수 있기 때문입니다. 실제로
isinstance()
의 두 번째 매개변수가 튜플일 수 있으므로 예제를 훨씬 더 쉽게 작성할 수 있습니다:또는
basestring
추상 클래스를 사용하면 됩니다:파이썬 문서에 따르면 여기 문장이 있습니다:
따라서
isinstance()
가type()
보다 우선시되어야 합니다.실제 사용 차이는 어떻게 처리하는 '불 (bool) 값들':
'True' 와 '거짓' 이 '1' 과 '0' 의 키워드는 짓궂군요 그냥 파이썬. 따라서 "' 이신스턴스 (True, int) "' 및 "' 이신스턴스 (False, int) "' 반품해야 모두 'True'. 불 (bool) 값들 () 는 인스턴스에서는 모두 정수. 그러나 '유형 ()' 가 더 똑똑해. "' 유형 (True) = int "' 되돌려줍니다 '거짓'.
실제 사용 차이점을 찾을 수 있습니다, 하지만 난 그 '코드', '이신스턴스 can& # 39 의 기본 비헤이비어를 구현하십시오 찾을 수 없다 ()'.
하지만 비슷한 받을 수 있도록 한 [abc.__instancecheck__] (https://github.com/python/cpython/blob/master/Lib/_py_abc.py) 에 따르면 # L92-L147) [__instancecheck__] (https://docs.python.org/3/reference/datamodel.html # 사용자정의하기 하위 클래스 인스턴스 및 검사).
위에서 사용한 후 ',' abc.instancecheck 테스트 (아래 참조).
내가 afaq afnor 결론, '유형' 에 대한.
"에 대한 이신스턴스 ':
브트와: 사용하지 않는 게 좋다 ',' 에서 '함께' 상대 및 밀어버릴꺼에요 가져오기의 사용하여 nnt 가져오기의 project_dir (통해 추가된 '시스드패스')