파이썬 객체의 타입 결정
객체의 유형 결정 type
>>> obj = object()
>>> type(obj)
<class 'object'>
그것이 작동하지만, 이중 밑줄 속성 __class__
은 피상적으로 공개적이지 않으며, 아마도이 경우에는 아니지만 내장 함수는 일반적으로 더 나은 동작을합니다.
>>> obj.__class__ # avoid this!
<class 'object'>
타입 검사
변수가 목록, 사전 또는 다른 항목인지 확인하는 간단한 방법이 있습니까? 유형이 될 수있는 객체를 다시 가져오고 차이를 말할 수 있어야합니다.
글쎄, 그것은 다른 질문입니다, type-use를 사용하지 마십시오 isinstance
:
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
Liskov Substitution의 원칙에 따라 사용자가 코드를 어 기지 않고 서브 클래스 인스턴스를 사용할 수 있기를 원하는 서브 클래 싱으로 사용자가 영리하거나 현명한 작업을 수행하는 경우가 포함됩니다 isinstance
.
추상화 사용
더 좋은 점은 collections
또는 numbers
다음 에서 특정 추상 기본 클래스를 찾을 수 있습니다 .
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)
또는 명시 적으로 유형 검사하지 마십시오
또는 아마도 무엇보다도 오리 타이핑을 사용하고 코드를 명시 적으로 유형 검사하지 마십시오. 오리 타이핑은 Liskov 대체를 더 우아하고 덜 장황하게 지원합니다.
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
실제로 인스턴스 클래스를 얻는 데 사용 합니다.
isinstance
실제 서브 클래스 또는 등록 된 추상화를 명시 적으로 확인하는 데 사용 합니다.
- 그리고 적절한 곳에서 유형 검사를 피하십시오.