【问题标题】:Make object return float value python使对象返回浮点值python
【发布时间】:2014-12-06 00:12:54
【问题描述】:

我想不出任何其他语言有类似的东西,但希望 python 可以做这样的事情......

我需要的是:

当引用一个对象的值时,我需要该对象返回一个浮点数。例如:

    b = AnyObject(3, 4)
    print(b) #Should output 0.75

我已经尝试了以下方法:

 def __get__(self, instance, owner):
    return float(self.param1/self.param2)

但这不起作用。像这样打印 b 时,我只得到对象的引用:

<(...) object at 0x10fa77e10>

请帮忙! 谢谢

【问题讨论】:

  • 看看实现__str____repr__
  • 事后你还需要它成为那种类型的对象吗?
  • 什么文档/博客/什么告诉你在这里实现__get__?同时,你只是想控制这个打印的方式,还是你真的需要让它在你使用它的任何地方都像一个浮点值(所以,例如,你可以将它乘以一个 int 并得到漂浮回来)?
  • @Edgar Arousiounian:谢谢!这就是我要找的,根本找不到正确的覆盖方法!
  • @WhiteBr0wnie_24:不,使用__repr__ 确实不会让它在任何地方都像一个浮动,它只是让它像一个浮动打印出来 .同样,2 + bb.hex()abs(b) 是做什么的?

标签: python object get


【解决方案1】:

您看到的是&lt;Fraction object at 0xdeadbeef&gt;,因为这就是object 类的__str__ 方法在您的Python 实现中返回的内容:类名和地址。要使print 工作,您需要用自己的代码覆盖__str__ 方法,以替换从object 继承的方法。当您使用它时,您可以通过实现__float__ 方法使float(obj) 工作。

from __future__ import division

class Fraction(object):

    def __init__(self, num, den):
        self.num, self.den = num, den

    # the built-in function float(obj) calls obj.__float__()
    def __float__(self):
        """float(self): Return a float approximating the fraction."""
        return self.num / self.den

    # Python 2.6/2.7/3.x print() function and Python 2 print statement
    # call str(obj), which calls obj.__str__()
    def __str__(self):
        """str(self): Return a string representing the fraction."""
        return str(float(self))

【讨论】:

【解决方案2】:

你的问题是整数的除法也是整数:

>>> 3 / 4
0

您需要将对象浮点数作为参数,或者在除法之前将整数参数强制转换为浮点数:

>>> 3.0 / 4.0
0.75
>>> float(3) / float(4)
0.75 

【讨论】:

    【解决方案3】:

    @Daniel Reis:非常感谢您的回答,但这绝对不是我的问题。我的问题从来不是在任何地方都返回了错误的数字,而是对对象的引用给了我一个对象(通常想要的)而不是浮点数(就像我想要的那样),但是通过定义两种方法:

    def __repr__(self):
        return str(float(self.attr1/self.attr2))
    
    def __str__(self):
        return str(float(self.attr1/self.attr2))
    

    我得到了我想要的(参见原帖 cmets!

    【讨论】:

      猜你喜欢
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 2011-01-21
      相关资源
      最近更新 更多