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
但长度相同。