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()
해결책

요약하십시오 콘텐트입니다 위해 다른 (이미 优秀!) ',' 에 대한 답을 이신스턴스 충족시켜 상속 (오버클로킹된 인스턴스입니다 an_ 인스턴스입니다 _is 파생 클래스 (base class, 고쳐주렴), 확인하는 동안 언약보다는 것은 '유형' (id) 의 하위 유형을 lc-fc 유형 및 it 수요를 거부됩니다 인스턴스들도 하위 클래스).

일반적으로 파이썬 코드에서 운영까지도 지원할 수 있는, 상속, 물론 (이후 상속 너무 나쁜 정지점을 사용한 제품을 사용하여 코드를 될 수 있다고 되어 있어!) '는 더 이상 이신스턴스 도왔으매' 나쁜 '유형의 때문에 id 검사를 완벽하게 상속을 지원합니다.

39, that 's not it& 이신스턴스' 는 것은 보다 그냥 # 39 의 확인, 마음을 good you-it& less bad 추상형데이터타입. 일반, 파이썬, 우선 솔루션, 오리, &quot typing&quot 등도 가깝다. 특정 원하는 유형을 사용하여 시도하시겠습니까 as 전송되었기 if 인수, 그것을 할 수 있는 '' / '예외' 를 제외한 모든 시도하시겠습니까 경우 발생할 수 있는 것은 사실 인수에 관심을 기술서임을 해당 유형의 (또는 다른 유형 중에 덕 소리를 it; -) '과' 조항을 제외한 다른 방법을 시도해 보는 것이다. (name. domain. 인수, if&quot &quot 있다. 일부 다른 전송되었기 유형용).

그러나 '' 는 매우 특별한 경우-a 배서스트링 만 사용할 수 있는 '이신스턴스 내장 유형' ('와' 모두 'str 배서스트링 유니코드' 클래스 ''). 문자열은 시퀀스에만 (루프, 그들을 슬라이스에 그들 위에 인덱스화할 수 있습니다.), 일반적으로 정렬할지 확장하지만 처리하지 &quot 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&quot ";) 로 존재하는 것이 아니라,, 주로 하위 클래스 기능을 사용할 수 있는 '이신스턴스 &quot marker&quot'. 이 개념은 분명히 한 만큼 커지고 있으며, 파이썬, PEP 3119 는 파이썬 2.6 ~ 3.0gb 시작으로 it 는 일반화 수락됨 및 구현되어 있습니다.

분명히 할 수 있으며, 종종 상식 PEP 를 대체하기 위한 덕 타이핑 할 수 있어 매우 큰 압력을 일반적으로는 (http://otl. [here] [2]). 그러나 최근 파이썬 버전을 제공하십시오 상식 구현된 못하며창조된 추가 자료: '이제 단순히 &quot 짓궂군요 이신스턴스' ('와' 아서브클레스), [인스턴스입니다] 파생 class&quot. (특히, 모든 클래스에 registered&quot &quot 수 있습니다. 있는 ABC 도왔으매 것, 그 하위 클래스여야 인스턴스로 인스턴스입니다 ABC 로 표시). 상식 및 실제 클래스를 템플릿 메소드 추가 편의를 제공할 수 있습니다 아주 자연스러운 운행에서어떠한 애플리케이션과도 통해 디자인 패턴 (http://otl. herehere [[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 = 우저딕트 # 우저딕트.딕트미신 강조표시할?

해설 (3)

다음은 '인스턴스'가 '유형'이 할 수 없는 것을 달성하는 예입니다:

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는 서브클래스에도 참입니다.

또한 참조:

해설 (6)

&gt. # 차이점을 이신스턴스 () '와' 유형 ' ()' 의 파이썬?

함께 타입 검사

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 "", line 1, in 
  File "", 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

대한 설명:

&gt. 여러 클래스를 사용하여 견제하려는 데 사용할 수 있다는 점에 유의해야 합니다 유형 (A, B, C) '에서' 유형 (목표)

아뇨, 할 수 있지만, 여러 유형의 평등을 위한 테스트 그들위에 대신 사용할 수 있는 경우가 아니면 디렉토리에만 생산기지로 제어 흐름, 특히 이러한 유형:

isinstance(obj, (A, B, C))

'차이' 를 대체할 수 있는 이신스턴스 도래하도록하려하는, 다시 그 하위 클래스 속성 리스코프 치환 반응 없이 깨고, 부모에 대한 프로그램 () 로 알려져 있다.

그러나 더욱 너회의 종속물과의 및 don& 반전됩니다 # 39, 특정 유형을 확인할지 전혀 없다.

결론

때문에 대부분의 경우, 우리는 우리가 원하는 대체 하위 클래스 지원할 수 있는 '유형' 과 함께 '-' 이신스턴스 타입 검사 포지셔닝하십시오 타입 검사 피하고 싶어하는 경우가 아니라면 정말 클래스를 알아야 정확히까지 인스턴스입니다.

해설 (1)

후자가 선호되는데, 서브클래스를 제대로 처리할 수 있기 때문입니다. 실제로 isinstance()의 두 번째 매개변수가 튜플일 수 있으므로 예제를 훨씬 더 쉽게 작성할 수 있습니다:

if isinstance(b, (str, unicode)):
    do_something_else()

또는 basestring 추상 클래스를 사용하면 됩니다:

if isinstance(b, basestring):
    do_something_else()
해설 (0)

파이썬 문서에 따르면 여기 문장이 있습니다:

8.15. types - 내장형 이름

파이썬 2.2부터, 기본 제공 int()와 같은 팩토리 함수와 str()과 같은 팩토리 함수는 해당 타입의 이름이기도 합니다. 해당 형의 이름이기도 합니다.

따라서 isinstance()type()보다 우선시되어야 합니다.

해설 (0)

실제 사용 차이는 어떻게 처리하는 '불 (bool) 값들':

'True' 와 '거짓' 이 '1' 과 '0' 의 키워드는 짓궂군요 그냥 파이썬. 따라서 "' 이신스턴스 (True, int) "' 및 "' 이신스턴스 (False, int) "' 반품해야 모두 'True'. 불 (bool) 값들 () 는 인스턴스에서는 모두 정수. 그러나 '유형 ()' 가 더 똑똑해. "' 유형 (True) = int "' 되돌려줍니다 '거짓'.

해설 (0)

실제 사용 차이점을 찾을 수 있습니다, 하지만 난 그 '코드', '이신스턴스 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))


 __subclasses__ []
 __mro__ (, )
 __subclasshook__ NotImplemented
 __subclasshook__ NotImplemented
 __subclasses__ []
 __mro__ (, )
 __subclasshook__ NotImplemented
 __subclasshook__ NotImplemented
 __subclasses__ [..., , ]
 __mro__ (,)
 __subclasshook__ NotImplemented
 __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 (통해 추가된 '시스드패스')

해설 (0)