이 두 코드 조각의 차이점은 무엇인가요? 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()
요약하십시오 콘텐트입니다 위해 다른 (이미 优秀!) ',' 에 대한 답을 이신스턴스 충족시켜 상속 (오버클로킹된 인스턴스입니다 an_ 인스턴스입니다 _is 파생 클래스 (base class, 고쳐주렴), 확인하는 동안 언약보다는 것은 '유형' (id) 의 하위 유형을 lc-fc 유형 및 it 수요를 거부됩니다 인스턴스들도 하위 클래스).
일반적으로 파이썬 코드에서 운영까지도 지원할 수 있는, 상속, 물론 (이후 상속 너무 나쁜 정지점을 사용한 제품을 사용하여 코드를 될 수 있다고 되어 있어!) '는 더 이상 이신스턴스 도왔으매' 나쁜 '유형의 때문에 id 검사를 완벽하게 상속을 지원합니다.
그러나 '' 는 매우 특별한 경우-a 배서스트링 만 사용할 수 있는 '이신스턴스 내장 유형' ('와' 모두 'str 배서스트링 유니코드' 클래스 ''). 문자열은 시퀀스에만 (루프, 그들을 슬라이스에 그들 위에 인덱스화할 수 있습니다.), 일반적으로 정렬할지 확장하지만 처리하지 " scalar"; # 39 의 types-it& 다소 린코브니나 (단, 상당히 잦은 览侩 荤례) 치료를 위해 모든 종류의 문장열 (그리고 아마도 유형, 즉, 다른 스칼라 수준들과 너회가 can& # 39, t loop) 의 한 가지 방법은, 모든 컨테이너입니다 (목록, 세트, 딕토스.) 다른 방법으로 배서스트링 '플러스' 와 ',' 이 관용구 () 는 다음과 같은 것이 전반적인 구조를 작업자쪽에서 실행하십시오 이신스턴스 수 있습니다.
if isinstance(x, basestring)
return treatasscalar(x)
try:
return treatasiter(iter(x))
except TypeError:
return treatasscalar(x)
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 = 우저딕트 # 우저딕트.딕트미신 강조표시할?
다음은 '인스턴스'가 '유형'이 할 수 없는 것을 달성하는 예입니다:
class Vehicle:
pass
class Truck(Vehicle):
pass
이 경우 트럭 객체는 Vehicle이지만 다음과 같은 결과를 얻을 수 있습니다:
isinstance(Vehicle(), Vehicle) # returns True
type(Vehicle()) == Vehicle # returns True
isinstance(Truck(), Vehicle) # returns True
type(Truck()) == Vehicle # returns False, and this probably won't be what you want.
즉, isinstance
는 서브클래스에도 참입니다.
>. # 차이점을 이신스턴스 () '와' 유형 ' ()' 의 파이썬?
함께 타입 검사
isinstance(obj, Base)
하위 클래스 인스턴스 및 여러 가능한 기지를 사용할 수 있습니다.
isinstance(obj, (Base1, Base2))
반면 함께 타입 검사
type(obj) is Base
전용 up1 유형: 참조되었습니다.
참고, '는' 보다 더 적합한 것으로 보인다.
type(obj) == Base
수업은 때문에 싱글.
보통 치료할 수 있는 모든 형태의 단축시킵니다 운영까지도 인수만, 파이썬, 이 경우, 예상대로 객체에는 doesn& # 39, t 역할이 예상대로 부활시켜 적절한 오류:. 다형성, 소트트웨어용 덕 타이핑 이 알려져 있다.
def function_of_duck(duck):
duck.quack()
duck.swim()
위 코드를 작동됨 경우 우리 오리 인수는 것으로 수 있습니다. 따라서 우리는 다른 것들은 실제 통과될 수 있는 오리 의 하위 유형:
function_of_duck(mallard)
같이 일하는 또는 오리.
function_of_duck(object_that_quacks_and_swims_like_a_duck)
그리고 우리의 코드를 계속 작동합니다.
그러나 몇 가지 경우를 명시적으로 유형 검사 것이 바람직하다. 아마도 그 것을 다른 객체 유형에 함께 할 수 있습니다. 예를 들어, 마리의 개체를 구성할 수 있는 다테프라임 충스러웠으니 딕토스 net/ 또는 레코드는유지합니다. 이 경우 코드에 지시에요 가져오는 것은 어떤 유형의 주장을 제대로 감당할 수 있도록.
따라서 이 질문에 대답할 수 있습니다.
나를 보여줄 수 있도록 차이:
말하도다 특정 기능을 유지하는 데 필요한 경우 특정 종류의 질문을 되돌려줍니다 비헤이비어를 인수 (구성자를 위한 공통 활용). 문자용 선택하면 다음과 같습니다.
def foo(data):
'''accepts a dict to construct something, string support in future'''
if type(data) is not dict:
# we're only going to test for dicts for now
raise ValueError('only dicts are supported for now')
만약 우리가 딕트 시도하시겠습니까 통과할 수 있는 '의 하위 클래스인 딕트' (아니라 우리가 할 수 있어야, /usr/stuff1/file we& # 39, re 검색되어야 lionbridge 코드 따를 것 같다. 리스코프 치환, 그 하위 유형에 대한 대체할 수 있습니다.) 의 코드 분리!:
from collections import OrderedDict
foo(OrderedDict([('foo', 'bar'), ('fizz', 'buzz')]))
더욱이 오류가!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in foo
ValueError: argument must be a dict
리스코프 치환! ',' 우리가 사용하는 신앙이니라 이신스턴스 지원할 수 있습니다.
def foo(a_dict):
if not isinstance(a_dict, dict):
raise ValueError('argument must be a dict')
return a_dict
foo(OrderedDict([('foo', 'bar'), ('fizz', 'buzz')]))
'되돌려줍니다 오르데레디스 ([(& # 39, foo& # 39, & # 39, bar& # 39;), (& # 39, & # 39, # 39 buzz& fizz& # 39;;)])'
사실 우리가 할 수 있는 더 좋다. '컬렉션' 은 추상 베이스 클래스를 위한 최소한의 프로토콜뿐만 적용되는 각종. 우리는 단지 '의 경우, 다음, 그리고 우리의 코드' 프로토콜을 작성되지는 매핑에서는 우리가 할 수 있는 유연한 더욱 커집니다.
from collections import Mapping
def foo(a_dict):
if not isinstance(a_dict, Mapping):
raise ValueError('argument must be a dict')
return a_dict
>. 여러 클래스를 사용하여 견제하려는 데 사용할 수 있다는 점에 유의해야 합니다 유형 (A, B, C) '에서' 유형 (목표)
아뇨, 할 수 있지만, 여러 유형의 평등을 위한 테스트 그들위에 대신 사용할 수 있는 경우가 아니면 디렉토리에만 생산기지로 제어 흐름, 특히 이러한 유형:
isinstance(obj, (A, B, C))
'차이' 를 대체할 수 있는 이신스턴스 도래하도록하려하는, 다시 그 하위 클래스 속성 리스코프 치환 반응 없이 깨고, 부모에 대한 프로그램 () 로 알려져 있다.
그러나 더욱 너회의 종속물과의 및 don& 반전됩니다 # 39, 특정 유형을 확인할지 전혀 없다.
때문에 대부분의 경우, 우리는 우리가 원하는 대체 하위 클래스 지원할 수 있는 '유형' 과 함께 '-' 이신스턴스 타입 검사 포지셔닝하십시오 타입 검사 피하고 싶어하는 경우가 아니라면 정말 클래스를 알아야 정확히까지 인스턴스입니다.
후자가 선호되는데, 서브클래스를 제대로 처리할 수 있기 때문입니다. 실제로 isinstance()
의 두 번째 매개변수가 튜플일 수 있으므로 예제를 훨씬 더 쉽게 작성할 수 있습니다:
if isinstance(b, (str, unicode)):
do_something_else()
또는 basestring
추상 클래스를 사용하면 됩니다:
if isinstance(b, basestring):
do_something_else()
파이썬 문서에 따르면 여기 문장이 있습니다:
8.15. types - 내장형 이름
파이썬 2.2부터, 기본 제공 int()
와 같은 팩토리 함수와 str()
과 같은 팩토리 함수는 해당 타입의 이름이기도 합니다. 해당 형의 이름이기도 합니다.
따라서 isinstance()
가 type()
보다 우선시되어야 합니다.
실제 사용 차이점을 찾을 수 있습니다, 하지만 난 그 '코드', '이신스턴스 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 테스트 (아래 참조).
# file tree
# /test/__init__.py
# /test/aaa/__init__.py
# /test/aaa/aa.py
class b():
pass
# /test/aaa/a.py
import sys
sys.path.append('/test')
from aaa.aa import b
from aa import b as c
d = b()
print(b, c, d.__class__)
for i in [b, c, object]:
print(i, '__subclasses__', i.__subclasses__())
print(i, '__mro__', i.__mro__)
print(i, '__subclasshook__', i.__subclasshook__(d.__class__))
print(i, '__subclasshook__', i.__subclasshook__(type(d)))
print(isinstance(d, b))
print(isinstance(d, c))
<class 'aaa.aa.b'> <class 'aa.b'> <class 'aaa.aa.b'>
<class 'aaa.aa.b'> __subclasses__ []
<class 'aaa.aa.b'> __mro__ (<class 'aaa.aa.b'>, <class 'object'>)
<class 'aaa.aa.b'> __subclasshook__ NotImplemented
<class 'aaa.aa.b'> __subclasshook__ NotImplemented
<class 'aa.b'> __subclasses__ []
<class 'aa.b'> __mro__ (<class 'aa.b'>, <class 'object'>)
<class 'aa.b'> __subclasshook__ NotImplemented
<class 'aa.b'> __subclasshook__ NotImplemented
<class 'object'> __subclasses__ [..., <class 'aaa.aa.b'>, <class 'aa.b'>]
<class 'object'> __mro__ (<class 'object'>,)
<class 'object'> __subclasshook__ NotImplemented
<class 'object'> __subclasshook__ NotImplemented
True
False
내가 afaq afnor 결론, '유형' 에 대한.
# according to `abc.__instancecheck__`, they are maybe different! I have not found negative one
type(INSTANCE) ~= INSTANCE.__class__
type(CLASS) ~= CLASS.__class__
"에 대한 이신스턴스 ':
# guess from `abc.__instancecheck__`
return any(c in cls.__mro__ or c in cls.__subclasses__ or cls.__subclasshook__(c) for c in {INSTANCE.__class__, type(INSTANCE)})
브트와: 사용하지 않는 게 좋다 ',' 에서 '함께' 상대 및 밀어버릴꺼에요 가져오기의 사용하여 nnt 가져오기의 project_dir (통해 추가된 '시스드패스')