단순한 방법이 있는지 여부를 확인하는 가변입니다 바뀌엇어요, 사전, 또는 something else? 그리고 데릭쉐퍼드와 유형 중 하나가 될 수 있는 발생하는 실로나는 뒤로를 객체에는 말할 수 있을 것으로 말한다.
개체의 유형을 afaq 내장현 사용할 수 있습니다 (['유형' ()] http://docs.python.org/3/library/functions.html # 유형용) 함수. 해당 객체의 유형 객체에는 반군지역 로케이터로 있는 유일한 매개변수입니다 반환되므로.
>>> type([]) is list
True
>>> type({}) is dict
True
>>> type('') is str
True
>>> type(0) is int
True
>>> type({})
<type 'dict'>
>>> type([])
<type 'list'>
또한 이 작품은 물론 사용자 유형에 대한:
>>> class Test1 (object):
pass
>>> class Test2 (Test1):
pass
>>> a = Test1()
>>> b = Test2()
>>> type(a) is Test1
True
>>> type(b) is Test2
True
참고로 '유형 ()' 에서는 즉시인지 객체의 타입은 반품하십시오 있지만, 상속 유형에 대한 말할 수 없게 됩니다.
>>> type(b) is Test1
False
이 사실을 은폐하기 위해 콩지름에 ['이신스턴스'] (http://docs.python.org/3/library/functions.html # 이신스턴스) 함수. 또한 이 방법은 물론 내장현 유형:
>>> isinstance(b, Test1)
True
>>> isinstance(b, Test2)
True
>>> isinstance(a, Test1)
True
>>> isinstance(a, Test2)
False
>>> isinstance([], list)
True
>>> isinstance({}, dict)
True
보통 유형 ' ()' 가 더 좋은 방법은 신중하게 이신스턴스 때문에 또 파생됨 동의하십시오 객체의 유형. 그래서 실제 필요한 경우가 아니라면 유형 객체에는 어떤 이유로든) 을 통해 '유형 ()' '이신스턴스 ()' 를 사용하는 것이 좋습니다.
두 번째 매개 변수를 이신스턴스 승인하면 튜플 () '도', 그러니까 이건 여러 유형의 추상형데이터타입 한 번에 확인할 수 있습니다. 그러면 어떤 '진정한' 이신스턴스 복귀하십시오 객체인지 경우 이러한 유형:
>>> isinstance([], (tuple, list, set))
True
그러나 '블록'. '는' 더 많은 파이썬 시도하시겠습니까 사용할 수 있습니다. 이 같은 경우, 또는 돌팔이 바뀌엇어요 돌팔이 이쪽요, 클래스, it like a 딕트 내용과 상관없이 그 유형을 는 정말 제대로 작동합니다.
명확하게 하는 방법을 선호 " 전달하며 difference"; 뭔가 불렀으매 가변적입니다 유형은 사이에 있는 덕 타이핑: deltamove 의 방법 (및 반환 유형) 가 필요한 대응할 수 있는 변수가 될 것으로 예상하고 있습니다, 마치 너희는너희가 서브루틴 치료할 수 있을 것으로 기대하고 있다. 예를 들어, you have a 클래스를 과부하를 '재미' 일부 '와' 스테드 브래킷에 연산자로 그레타르 사용되지만, 적합한 행동을 한 내부 구성표가 될 수 있다고 redhat. that& # 39 의 경우 어떤 it& # 39 의 사전 에뮬레이션하도록 있다.
다른 문제 유형 () 는 유형 (B) '와' 확인 'A' 는 것은, 이 경우 하위 'B' 로 평가되는 ',' 진정한 '희망' 을 (를) 프로그램을 통해 거짓값 것이 됩니다. 같이 일하는 객체의 경우 하위 바뀌엇어요 바뀌엇어요 합니다. 다른 유형으로 소개된 이 오토메이티드 확인 못할 것이라고 말했다. ('작업' 은 이신스턴스 하지만).
객체 인스턴스에 대한 수도 있습니다.
__class__
속성. 다음은 샘플 빼앗아 파이썬 3.3tb 콘솔입니다
>>> str = "str"
>>> str.__class__
<class 'str'>
>>> i = 2
>>> i.__class__
<class 'int'>
>>> class Test():
... pass
...
>>> a = Test()
>>> a.__class__
<class '__main__.Test'>
파이썬 (Python 에서 이비이블 선택적으로 2.6) 에서 3.x 및 그 저주가 신식 클래스뿐만 병합되었습니다 가끔 예상치 못한 결과를 초래할 수 있으며, 이 클래스 및 유형 왔다. 내가 좋아하는 것은 주로 이 방법을 테스트 유형은상위 / classes) 은 [이신스턴스] (http://docs.python.org/3.3/library/functions.html # 이신스턴스) 기능이 내장되어 있다.
사항결정 있는 객체의 유형 '유형'
>>> obj = object()
>>> type(obj)
<class 'object'>
비록 작동하잖아 피할 수 없는, re like ',' - # 39 연산뿐 밑줄 속성뿐 class they& 의미 없는 반면, 이 경우 일반적으로 내장 기능 및 공공, 아마도 더 나은 비헤이비어를.
>>> obj.__class__ # avoid this!
<class 'object'>
>. 단순한 방법이 있는지 여부를 확인하는 가변입니다 바뀌엇어요, 사전, 또는 something else? 그리고 데릭쉐퍼드와 유형 중 하나가 될 수 있는 발생하는 실로나는 뒤로를 객체에는 말할 수 있을 것으로 말한다.
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
이 일을 통해 사용자 수 있는 경우를 닫히지만 하위 클래스화 str '-' 영리한 또는 합리적인 원칙에 따라 리스코프 치환, 원하는걸까요 하위 클래스 코드에 사용할 수 있는 '와' 이신스턴스 끊기지 않고 인스턴스입니다 - 이러한 기능을 지원합니다.
더 높은 추상 베이스 클래스를 검색할 수 있습니다 "에서 컬렉션 '또는' 숫자 ':
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
또는, 아마도, 그리고 무엇보다도 덕 타이핑 don& 코드에 명시적으로 유형 검사 # 39, 사용할 수 없다. 리스코프 치환 덕 타이핑 汲摹窍妨绰 더욱 세련된 디자인 및 리스토어할 verbosity.
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
유형 () '또는' 이신스턴스 () '' 사용할 수 있습니다.
>>> type([]) is list
True
소지품 목록 '또는' 고 할 수 있는 모든 종류의 변수로 지정하여 현재 유효범위 같은 이름의.
>>> the_d = {}
>>> t = lambda x: "aight" if type(x) is dict else "NOPE"
>>> t(the_d) 'aight'
>>> dict = "dude."
>>> t(the_d) 'NOPE'
위에 있는 '가' 우리가 지켜보리니 딕트 재할당되거나 문자열으로, 따라서 테스트:
type({}) is dict
스파이스트
이를 해결하기 위해 및 사용 '유형 ()' 보다 신중한 태도를 보였다.
>>> import __builtin__
>>> the_d = {}
>>> type({}) is dict
True
>>> dict =""
>>> type({}) is dict
False
>>> type({}) is __builtin__.dict
True
반면, 내가 찾는 것은 매우 오래된 동안 이 질문에 대해 적절한 방법으로 아웃하려면 발견했다 나 여전히 필요한 것 같아요 전 적어도 위한 파이썬 2.x , (않았다 검사를 파이썬 3, 때문에 문제가 발생할 의 클래식 클래스뿐만 없어질 수 있는 등 버전, 아마도 doesn& # 39, t 사건).
class One:
pass
class Two:
pass
o = One()
t = Two()
o_type = type(o)
t_type = type(t)
print "Are o and t instances of the same class?", o_type is t_type
이 스니핏을 실행 죽이려하겠어요 용량:
Are o and t instances of the same class? True
현재 대부분의 사람들이 아니다, 내가 있는 것이라고 할 수 있을 것으로 기대하고 있다.
하지만 '이' class 외곽진입 가장 가까운 남편과 won& 작업하십시오, t # 39 한 중요한 사례: 객체가 클래스를 전달 된 때, 그 이후 이전 스타일 (아닌 인스턴스입니다!) 등 객체에는 속성용 없다.
이 중 가장 작은 코드 스니핏 충족합니다 일관된 방식으로 생각할 수도 있어 이러한 당위적 질문:
#!/usr/bin/env python
from types import ClassType
#we adopt the null object pattern in the (unlikely) case
#that __class__ is None for some strange reason
_NO_CLASS=object()
def get_object_type(obj):
obj_type = getattr(obj, "__class__", _NO_CLASS)
if obj_type is not _NO_CLASS:
return obj_type
# AFAIK the only situation where this happens is an old-style class
obj_type = type(obj)
if obj_type is not ClassType:
raise ValueError("Could not determine object '{}' type.".format(obj_type))
return obj_type
예를 들어 있는지 확인하는 명시적으로 대신 뭔가 바뀌엇어요 호스트당:
isinstance(my_obj, list)
from collections.abc import Sequence
isinstance(my_obj, Sequence)
다른 많은 상식 ',' 로 사용될 수 있는 아니했다고 정의됩니까 매핑에서는 객체에는 매핑하며 이트레이블 호출 ',' ',' 등. 이러한 모든 전체 목록을 볼 수 있는 [설명서 '대한' 콜레스티언스트베크.] [3]
[2]: https://docs.python.org/3/library/collections.abc.html # 콜레스티언스트바차오지케노스 [3]: https://docs.python.org/3/library/collections.abc.html # 클래스가 추상 기본 모음
유형 () '가' () ',' 보다 나은 솔루션을 이신스턴스 특히 '불 (bool) 값들':
'True' 와 '거짓' 이 '1' 과 '0' 의 키워드는 짓궂군요 그냥 파이썬. 따라서 "' 이신스턴스 (True, int) "' 및 "' 이신스턴스 (False, int) "' 반품해야 모두 'True'. 불 (bool) 값들 () 는 인스턴스에서는 모두 정수. 그러나 '유형 ()' 가 더 똑똑해. "' 유형 (True) = int "' 되돌려줍니다 '거짓'.
일반적으로 클래스 이름과 함께, 개체에서 문자열으로 추출할 수 있습니다
str_class = object.__class__.__name__
비교를 위해, it 및 사용
if str_class == 'dict':
# blablabla..
elif str_class == 'customclass':
# blebleble..
대부분의 경우 실제 사용하는 대신 '유형' 또는 '이신스턴스' 을 사용할 수도 있습니다. (['@functools.singledispatch'] https://docs.python.org/library/functools.html # 펑스올s.싱글디스파치) 를 정의하는 데 사용되는 [일반 기능을] (https://docs.python.org/glossary.html # 일반 용어 함수) ( 구성된 여러 기능을 구현하는 기능에 대해 동일한 작업을 서로 다른 유형의 ).
즉, 이 경우 다음과 같은 코드를 그녀의심장을 사용할 수 있습니다. "' 데프 do_something (arg): 만약 이신스턴스 (arg, int): . # 정수 처리, 일부 특정 코드 만약 이신스턴스 (arg, str): . # 관련된 일부 코드를 문자열 처리 만약 이신스턴스 (arg, list): . # 프로세성 열거합니다 관련된 몇 가지 코드 . # 상술합니다 "'
이것은 작은 사례를 작동하잖아: "' 싱글디스파치 충스러웠으니 펑스올스 가져오기의
@singledispatch 데프 say_type (arg): 높이는 노림프레멘테더로 (f", I don& (arg)}, {type t # 39 작동합니까 ")
@say_type.register 데프 _입니다 (arg: int): 보기인쇄 (arg}, {f" 백업이었습니다 integer")
@say_type.register 데프 _입니다 (arg: 부울): 보기인쇄 (arg boolean" {} 는 f";) "' "'없음 > > >;; say_type (0) 0 은 정수 > > >;; say_type (False) 거짓값 는 부울입니다 > > >;; say_type (딕트 ())
애디티오널리 이용할 수 있다 [추상 클래스] (https://docs.python.org/library/collections.abc.html) 를 한 번에 여러 유형이 빽이라는. "' 임포트합니다 충스러웠으니 콜레스티언스트베크 e0100042.log
@say_type.register 데프 _입니다 (arg: E0100042.log): 보기인쇄 (}, {arg 는 " f" 시퀀스일!;) "' "'없음 > > >;; say_type ([0, 1, 2]) [0, 1, 2] 는 시퀀스일! > > >;; say_type ((1, 2, 3)) (1, 2, 3) 는 시퀀스일! "'