답변:
Dennis 덕분에 4 바이트가 제거되었습니다.
최신 버전은 xnor의 답변에서 "어떤 이유"에서 영감을 얻었습니다.
class t(int):__add__=type
a=b=t()
c=d=0
x.count
바이트를 저장합니다.
type(t(), t())
하거나 ... t().type(t())
예외를 던지므로 당신이 할 때 무슨 일이 일어나고 t() + t()
있습니까?
__add__
은 두 개로 호출되지만 첫 번째는로 해석되고 self
로만 other
전달됩니다 type
. 이상하다.
a + b
먼저 시도합니다 a.__add__(b)
. a.__add__
인 type
즉가되도록, type(b)
. 이 경우와 메소드의 일반적인 경우의 주요 차이점은 보통 일반 함수 객체가 구현하는 디스크립터 프로토콜 로 인해 클래스 정의에서 a.__add__
설정 한 것과 다른 객체라는 것 입니다. (여기에 관련이없는 몇 가지 다른 까다로운 비트도 있습니다.)__add__
class m(int):__call__=__add__=lambda*x:m()
a=b=c=d=m()
int
추가하거나 호출하는 것만으로 자신의 사본을 반환하는 것을 제외하고 에서 상속되는 객체를 만듭니다 .
같은 길이 :
class m(int):__call__=__add__=lambda a,b:a
a=b=c=d=m()
나는 대신에 생각 min
하거나 {}.get
일할 lambda a,b:a
것이지만, 어떤 이유로 그들은 두 번째 주장에 대해서만 행동합니다.
min
이미 __self__
속성을 가지고 있기 때문에 작동하지 않으므로 클래스는 자체 바인딩을 건너 뜁니다. 또 다른 질문이있는 이유 min
는 __self__
...
min
가있는 사실과는 아무런 관련이 없습니다 __self__
. min.__self__
내장 함수와 내장 메소드가 동일한 유형으로 구현되는 방식의 인공물입니다. min
내장 함수는 파이썬으로 작성된 함수와 달리 첫 번째 인수를 바인딩하는 디스크립터 프로토콜을 지원하지 않기 때문에 여기서 작동하지 않습니다.
기존 답변과 실제로 경쟁 할 수는 없지만 실제로는 해당 계산을 수행합니다.
from sympy.abc import*
type(a+b).__call__=lambda x,y:(x*y).expand()
설명:
sympy.abc
모든 단일 문자 기호를 포함, 이름이 특정 사람의 a
, b
, c
,와 d
.a+b
인 Add
일반 합을 나타내는 개체.type(a+b).__call__= […]
monkey는 Add
클래스를 패치하여 평가 기능을 제공하며,이 경우 호출자와 호출 수신자의 곱셈처럼 작동 할 수 있습니다.expand
실제로 표현식을 동일하게 만드는 데 필요합니다 (SymPy는 요청시 철저한 동등성 검사 만 수행하므로).
0 .__mul__
에 대한lambda y:0
하지만 같은 길이입니다.