문제

차이점은 무엇입니까? 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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top