Answers:
多亏了丹尼斯,删除了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在这里不起作用,因为与用Python编写的函数不同,内置函数不支持描述符协议,该协议负责绑定第一个参数。
尽管它不能与现有答案真正竞争,但实际上它执行了有问题的计算:
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__= […]猴子修补Add类,使其具有评估功能,在这种情况下,使其能够像调用方和被调用方的乘法一样工作。expand 必须使表达式实际上相等(因为SymPy仅按需执行彻底的相等检查)。
0 .__mul__,lambda y:0但长度相同。