programing

왜 파이썬 3.x의 슈퍼() 마법인가요?

nicescript 2023. 5. 22. 23:38
반응형

왜 파이썬 3.x의 슈퍼() 마법인가요?

Python 3.x에서는 인수 없이 호출할 수 있습니다.

class A(object):
    def x(self):
         print("Hey now")

class B(A):
    def x(self):
        super().x()
>>> B().x()
Hey now

이 작업을 수행하기 위해 일부 컴파일 타임 마법이 수행되며, 그 결과 다음 코드가 다시 바인딩됩니다.super로.super_) 실패:

super_ = super

class A(object):
    def x(self):
        print("No flipping")

class B(A):
    def x(self):
        super_().x()
>>> B().x()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in x
RuntimeError: super(): __class__ cell not found

이유는super()컴파일러의 도움 없이 런타임에 슈퍼클래스를 해결할 수 없습니까?이 행동 또는 그 근본적인 이유가 부주의한 프로그래머를 물 수 있는 현실적인 상황이 있습니까?

그리고 부수적인 질문으로: 파이썬에서 함수, 메소드 등을 다른 이름으로 다시 바인딩하여 깰 수 있는 다른 예가 있습니까?

새로운 마법super()행동은 D.R.Y.(반복하지 말 것) 원칙을 위반하지 않기 위해 추가되었습니다. PEP 3135를 참조하십시오.클래스를 글로벌로 참조하여 클래스의 이름을 명시적으로 지정해야 하는 경우에도 발견한 것과 동일한 리바인딩 문제가 발생할 수 있습니다.super()자체:

class Foo(Bar):
    def baz(self):
        return super(Foo, self).baz() + 42

Spam = Foo
Foo = something_else()

Spam().baz()  # liable to blow up

마찬가지로 새 오브젝트를 반환하고 클래스 이름을 다시 바인딩하는 클래스 데코레이터 사용도 마찬가지입니다.

@class_decorator_returning_new_class
class Foo(Bar):
    def baz(self):
        # Now `Foo` is a *different class*
        return super(Foo, self).baz() + 42

마법super() __class__셀은 원래 클래스 개체에 대한 액세스를 제공하여 이러한 문제를 잘 해결합니다.

PEP는 처음에 키워드가 되는 것을 꿈꾸던 Guido에 의해 시작되었고, 현재 클래스를 찾기 위해 셀을 사용하는 아이디어도 그의 것이었습니다.확실히, 그것을 키워드로 만드는 아이디어는 PEP 초안의 일부였습니다.

하지만, 사실 Guido 자신이 키워드 아이디어에서 '너무 마법적'으로 물러나 대신 현재의 구현을 제안했습니다.는 에 대해 다른 이름을 사용하는 이 문제가 될 수 있다고 예상했습니다.

내 패치는 중간 솔루션을 사용합니다. 이 패치는 필요하다고 가정합니다.__class__이름이 지정된 변수를 사용할 때마다'super'따라서 (글로벌하게) 이름을 변경할 경우super로.supper및 사용supper하지만 아닙니다.super논쟁 없이는 작동하지 않을 것입니다(하지만 당신이 그것을 통과하더라도 여전히 작동할 것입니다).__class__또는 실제 클래스 개체); 이름이 지정된 관련이 없는 변수가 있는 경우super작동하지만 메소드는 셀 변수에 사용되는 약간 느린 호출 경로를 사용합니다.

그래서, 결국, Guido 자신이 그것을 사용한다고 선언했습니다.super키워드가 제대로 느껴지지 않았고, 마법을 제공하는 것.__class__셀은 허용 가능한 절충안이었습니다.

놀랍다는 하지만, 구의마술이암행다동것동놀만지의하에는랍다소현이고묵적인적,▁i▁of,super()는 언어에서 가장 잘못 인식된 함수 중 하나입니다.인터넷에서 잘못 적용되거나 호출된 모든 코드를 보면 파생 클래스에서 호출된 코드가 있으면 무한 재귀 예외가 발생하게 됩니다.최소한 단순화된 것은super()인수 없이 호출하면 해당 문제를 피할 수 있습니다.

이 바뀐 이이변된경우경름에 super_ 참고만 해주세요.__class__당신의 방법으로도 그리고 그것은 다시 작동할 것입니다.셀은 다음 중 하나를 참조할 경우 생성됩니다.super 또는 __class__메소드의 이름:

>>> super_ = super
>>> class A(object):
...     def x(self):
...         print("No flipping")
... 
>>> class B(A):
...     def x(self):
...         __class__  # just referencing it is enough
...         super_().x()
... 
>>> B().x()
No flipping

언급URL : https://stackoverflow.com/questions/19608134/why-is-python-3-xs-super-magic

반응형