유형 (obj)과 obj .__ class__의 차이
-
21-08-2019 - |
문제
차이점은 무엇입니까? type(obj)
그리고 obj.__class__
? 가능성이 있습니까? type(obj) is not obj.__class__
?
다른 매개 변수와 동일한 유형의 기본값 1을 사용하여 제공된 객체에서 일반적으로 작동하는 함수를 작성하고 싶습니다. 아래의 #1 또는 #2의 변형은 올바른 일을 할 것입니까?
def f(a, b=None):
if b is None:
b = type(a)(1) # #1
b = a.__class__(1) # #2
해결책
type(obj)
그리고 type.__class__
구식 수업에서도 동일하게 행동하지 마십시오.
>>> class a(object):
... pass
...
>>> class b(a):
... pass
...
>>> class c:
... pass
...
>>> ai=a()
>>> bi=b()
>>> ci=c()
>>> type(ai) is ai.__class__
True
>>> type(bi) is bi.__class__
True
>>> type(ci) is ci.__class__
False
다른 팁
이것은 오래된 질문이지만, 그 대답은 그것을 언급하지 않는 것 같습니다. 일반적으로 이다 새 스타일 클래스가 다른 가치를 가질 수 있습니다. type(instance)
그리고 instance.__class__
:
class ClassA(object):
def display(self):
print("ClassA")
class ClassB(object):
__class__ = ClassA
def display(self):
print("ClassB")
instance = ClassB()
print(type(instance))
print(instance.__class__)
instance.display()
산출:
<class '__main__.ClassB'>
<class '__main__.ClassA'>
ClassB
그 이유는 그 이유입니다 ClassB
우선하고 있습니다 __class__
디스크립터이지만 객체의 내부 유형 필드는 변경되지 않았습니다. type(instance)
해당 유형 필드에서 직접 읽으므로 올바른 값을 반환하는 반면 instance.__class__
내부 유형 필드를 읽는 Python에서 제공하는 원래 디스크립터를 교체하는 새 설명자를 나타냅니다. 내부 유형 필드를 읽는 대신 하드 코드 값을 반환합니다.
구식 수업은 문제입니다.
>>> class old: pass
...
>>> x=old()
>>> type(x)
<type 'instance'>
>>> x.__class__
<class __main__.old at 0x6a150>
>>>
Python 3에서는 문제가되지 않습니다. 모든 클래스는 현재 새 스타일이므로 ;-).
Python 2에서는 다른 새로운 스타일 클래스에서 상속되는 경우에만 수업은 새 스타일입니다 (포함 object
및 다양한 내장 유형 dict
, list
, set
, ...) 또는 암시 적 또는 명시 적으로 설정합니다 __metaclass__
에게 type
.