2014-01-07 39 views
0

以下代碼是以float作爲其父類的基本Angle對象的初始化方法。允許子類在python中具有與其父類不同的* args和** kwargs

class Angle(float): 
    def __init__(self, value, vertex2 = None, vertex3 = None, atype = 'convex'): 

     #type-checking for the input args 
     try: 
      #checks for value arg 
      angle = value 
      if not (0 < value < 360): 
       angle %= 360 
     except TypeError: 
      #checks for three-vertice args 
      try: 
       angle = three_point_angle(value, vertex2, vertex3) 
       #three_point_angle is a function to calculate the 
       #convex angle between three vertices (i.e. at vertex2) 
       if atype == 'concave': 
        angle = 360 - angle 
       self._vdict = {} 
       for pos, vert in enumerate([value, vertex2, vertex3]): 
        self._vdict[pos] = vert 
      except: 
       raise TypeError(\ 
        "You may only specify either an angle value, or three vertices from which \ 
        to calculate the angle. You input a %s, %s and %s value." % (\ 
         type(value), type(vertex2), type(vertex3))) 
     self.angle = angle 

這個類背後的想法是,可以任一輸入爲角度的值,或指定三個頂點(和任選的角型參數)來自動計算角度。最後,self.angle始終被初始化,這就是所有算術發生的地方(所以__add__(self, other)會影響self.angle)。

它從float繼承的原因是要繼承其反射和增強賦值的魔術方法,它們都在self.angle上執行。

當試圖輸入三個頂點值時,就會出現問題。由於它從float繼承,因此它不能接受一個以上的參數,因此會產生錯誤。我將如何解決這個問題?我的猜測是,我將不得不爲Angle創建一個__new__方法,以便它將被調用而不是超類',但我不知道我甚至可以從那開始,或者即使它是正確/最佳的方式去做這件事。

+0

什麼是完整的錯誤追溯?我認爲這個問題不是你所描述的。 – jonrsharpe

+0

'一個=角度(頂點(0,0),頂點(0,10),頂點(10,10))' 引出 '類型錯誤:浮子()採用至多1個參數(3中給出)' – user3002473

回答

1

你並不需要從浮繼承。你錯誤地認爲神奇的方法是在self.angle上執行的;他們只是在自我表演。試試下面的代碼:

class Angle(float): 
    def __init__(self, x): 
     self.angle = x 
    def double(self): 
     self.angle *= 2 
a = Angle(1) 
a.double() 
print a # prints 1.0 
print a.angle # prints 2 
a *= 5 
print a # prints 5.0 
print a.angle # throws AttributeError 

a.angle不受魔術方法,也不是a.angle受操作float(a)float s是不可變的,所以a *= 5創建了一個新的float,具有不同的屬性。

因此,如果您將Angle更改爲從Object繼承而不是float,則可以控制初始化,而不會失去任何便利。

相關問題