【问题标题】:Need for float __len__, not integer需要浮点 __len__,而不是整数
【发布时间】:2013-07-27 15:12:00
【问题描述】:

出于我的目的,我创建了一个保存对象的类。

该对象的实际长度是浮点数,而不是整数。可以有 2 个对象相差 0.00001,最短的对我来说是最好的。

为方便起见,我在类中定义了一个 __len__ 方法,以便能够调用 len(obj)。

但是,python 不允许我为 __len__ 返回浮点数,只能返回整数。

我想为给定的 K 返回 int(real_length * 10**K)。

是否有更好的解决方案——使用类对象的浮点长度?

编辑:

在我的班级中,我在 n 维空间中有点,我考虑点之间的距离,这是一个实数,而不是整数。

我可以使用 len 函数吗?

【问题讨论】:

  • 我认为在这种情况下你应该定义另一个函数。
  • __len__ 应该返回对象的长度(假定是某种集合)。如果您需要依赖__len__ 来实现真实性,请定义自己的len 方法(或length 属性),然后使用__nonzero__/__bool__
  • 我同意@kabie...len 的数字毫无意义。内置的 int 使用 bit_length () 例如它读取它的确切含义
  • 您的对象“长度”似乎与 len() 引用的概念不同 -> int :序列或映射的项目数。你能澄清您的对象的确切长度是多少?会不会是分数之类的东西?
  • 我编辑了邮件。

标签: python


【解决方案1】:

这为浮点数添加了“字符串长度”功能。对象上的 len() 给出数字的长度,就好像它是一个字符串

   class mynumber(float):
        def __len__(self):
            return len(self.__str__())
        pass    


    a=mynumber(13.7)
    b=mynumber(13.7000001)

    print len(a)
    print len(b)

在 python 2.7 上测试。希望这会有所帮助

根据您的评论,这里有一个不同的答案。它设置了一个对象,该对象采用两个坐标对,然后使用 hasrsine (Haversine Formula in Python (Bearing and Distance between two GPS points)) 公式计算它们之间的距离

from math import radians, cos, sin, asin, sqrt

class mypointpair(object):
    def __init__(self):
        self.coord=[]
        pass
    def add_coords(self,a,b):
        self.coord.append((a,b)) 
    def __len__(self):
        return self.haversine(self.coord[0][0], self.coord[0][1], self.coord[1][0], self.coord[1][1])


    def haversine(self,lon1, lat1, lon2, lat2):
        """
        Calculate the great circle distance between two points 
        on the earth (specified in decimal degrees)
        """
        # convert decimal degrees to radians 
        lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
        # haversine formula 
        dlon = lon2 - lon1 
        dlat = lat2 - lat1 
        a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
        c = 2 * asin(sqrt(a)) 
        km = 6367 * c
        return km 


pp1=mypointpair()
pp1.add_coords(53.32055555555556 , -1.7297222222222221 )
pp1.add_coords(53.31861111111111, -1.6997222222222223 )

print len(pp1)

【讨论】:

  • 谢谢——但我有实数作为距离——在我的情况下点的数量并不重要——重要的是它们之间的空间距离。
  • 谢谢——我做了同样的事情:)。我只想知道其他人对这种情况有什么解决方案,以及其他人是否有比我更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
相关资源
最近更新 更多