Python 用最少的代码实现数字实数
我试图创建一个类Python 用最少的代码实现数字实数,python,abc,Python,Abc,我试图创建一个类MyFloat,它非常类似于float,但有一个value方法和一些其他方法。我还需要这个类的实例与realfloats交互,并在type(MyFloat(5)+4)是MyFloat而不是float的意义上保持“粘性” 这就是我到目前为止所做的: 类MyFloat(数字.实数): 定义初始值(自身,值): 自身值=浮动(值) @财产 def值(自身): 返回自我值 @价值设定者 def值(自身,值): 自身值=浮动(值) 定义浮点数(自): 回归自我价值 但现在我必须实现大量其
MyFloat
,它非常类似于float
,但有一个value
方法和一些其他方法。我还需要这个类的实例与realfloat
s交互,并在type(MyFloat(5)+4)
是MyFloat
而不是float
的意义上保持“粘性”
这就是我到目前为止所做的:
类MyFloat(数字.实数):
定义初始值(自身,值):
自身值=浮动(值)
@财产
def值(自身):
返回自我值
@价值设定者
def值(自身,值):
自身值=浮动(值)
定义浮点数(自):
回归自我价值
但现在我必须实现大量其他方法,以满足抽象基类numbers.Real
,以及我的要求,即这个“动作”类似于float
。问题是a)有很多这样的方法(\uuuuuu add\uuuuuu
,\uu trunc\uuuuu
,\uuuu floor\uuuuu
,\uuuuuu floordiv\uuuuuuu
…我想总共有24种)和b)它们都遵循相同的模式。也就是说,对于任何方法,我可能只想:
def\uuuu方法(自):
返回MyFloat(float.\uuuu方法\uuuu(float(self))
或
def\uuuu方法(自身、其他):
返回MyFloat(float.\uuuu方法\uuuu(float(self)、float(other)))
有没有一种方法可以在不手动实现每一个数学方法(并重复大量代码)的情况下实现我想要的功能
请记住,float.\uuuuu方法\uuuu
并不适用于所有方法。例如,float.\uuu floor\uuuu
不存在,但我仍然需要实现MyFloat.\uuuu floor\uuu
以满足数字.Real
抽象基类
编辑:建议扩展float
,这也是我的第一个想法,但我失去了“粘性”要求。例如:
>>类MyFloat(浮点):
def其他_方法(自身):
打印(“其他方法输出”)
>>>mf=MyFloat(8)
>>>mf.其他_方法()
其他方法输出
>>>o=mf+9
>>>类型(o)
>>>o.其他方法()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“float”对象没有属性“other\u method”
好的,这是我提出的最“优雅”的解决方案(即使是不断改进的)。如果有人提出改进建议,我很乐意选择你的作为正确答案
导入编号
输入数学
进口经营者
定义-操作员-生成器(数字-基本-cls,内置类型):
定义二进制方法生成器(内置运算符):
def二进制_方法(a、b):
如果存在(b,数字\u基数\u cls):
返回类型(a)(内置运算符(内置类型(a),内置类型(b)))
其他:
返回未执行
二进制方法。uuuu名称uuu='uuuuu'+内置运算符。uuu名称uuu+'uuu'
二进制\方法。\文档\运算符。\文档__
返回二进制法
定义一元方法生成器(内置运算符):
def一元法(a,*参数):
返回类型(a)(内置运算符(内置类型(a),*args))
一元方法。uuuu名称uuu='uuuuu'+内置运算符。uuu名称uuu+'uuu'
一元方法。文档=运算符。文档__
返回一元法
返回\u二进制\u方法\u生成器,\u一元\u方法\u生成器
_浮点\二进制\运算符\辅助对象,\浮点\一元\运算符\辅助对象=\运算符\生成器(numbers.Real,float)
类MyFloat(number.Real):
__add\uuuu=\ufloat\ubinary\uoperator\uhelper(operator.add)
__radd\uuuuuuu=\uuuuuu相加__
__trunc\uuuu=\u float\u monary\u operator\u helper(math.trunc)
__floor\uuuu=\u float\u monary\u operator\u helper(math.floor)
__ceil\uuuu=\u float\u monary\u operator\u helper(math.ceil)
__round\uuuu=\u float\u monary\u操作符\u helper(round)
#等等…对于所有dunder方法
定义初始值(自身,值):
自身值=浮动(值)
@财产
def值(自身):
返回自我值
@价值设定者
def值(自身,值):
自身值=浮动(值)
定义浮点数(自):
回归自我价值
一个改进是定义(
name
,func
)对的列表,并调用setattr(name,\u float\u monary\u operator\u helper(func))
在\uuuuu new\uuuuuuu
期间对每一个对象执行操作。但是,我不知道如何做到这一点并使ABC满意-它总是抱怨没有实现这些方法。您是否在问是否有一种方法可以在不手动实现所有方法的情况下创建现有对象类型的副本?您可以对它们进行一些欺骗r\uu getattr\uuu
或exec
和循环中的字符串格式。@user1558604不,我知道我可以从float继承,但我失去了我的“value”方法和我的“sticky”要求。(afaik)@MichaelButscher我没有触及exec
;-)如果你想对float进行子类化,为什么不这样做:class MyFloat(float):
然后在init函数中super()。这样,所有float类的属性和方法也都在您的classIf中。如果您扩展float,您应该能够使用它的所有函数,并在上面添加您自己的函数。