2013-07-27 68 views
1

爲了我的目的,我創建了一個保持對象的類。需要浮動__len__,不是整數

該對象的實際長度是float,而不是整數。可以有兩個物體相差0.00001,而最短的對我來說是最好的。

爲方便起見,我在類中定義了一個__len__方法,以便能夠調用len(obj)。

但是,python不允許我爲__len__返回float,只有整數。

我想返回INT(real_length * 10 ** K),對於給定的K.

是否有更好的解決方案 - 帶有浮動類對象的點長度工作?

編輯:

在我的班級我在n維空間中的點,我認爲點之間的距離,這是一個實數,而不是一個整數。

我可以利用len函數嗎?

+9

我認爲在這種情況下,你應該只是定義另一個函數的距離。 – Kabie

+0

'__len__'應該返回對象的長度(假定它是某種類型的集合)。如果你需要依靠'__len__'來實現真實感,定義你自己的'len'方法(或'length'屬性),然後使用'__nonzero__' /'__bool__'。 – Blender

+0

我同意@ kabie ......一個數字的「len」沒有意義。內建的'int'使用'bit_length()'作爲例子,它讀取的是什麼意思 –

回答

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進行了測試。希望這可以幫助

這是根據您的評論的不同答案。它設置了一個對象,它有兩個座標對,然後使用半正矢(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) 
+0

謝謝 - 但我有真正的數字作爲距離 - 在我的情況下點的數量並不重要 - 它僅重要它們之間的空間距離。 – alinsoar

+0

謝謝 - 我做了相同的東西:)。我只想知道其他人對這種情況的解決方案,並知道其他人是否有比我更好的解決方案。 – alinsoar