2014-02-22 26 views
5

遵守以下代碼:看似瑣碎的問題致電廉政局在Python __init__

class Angle(int): 
    """Basic Angle object: Angle(number)""" 

    def __init__(self, angle): 
     angle %= 360 
     super(Angle, self).__init__(angle) 

相當簡單的東西,Angle基本上只是一個int永不熄滅高於360或低於0。這__init__只是確保在輸入角度符合之前列出的條件。但由於某種原因,上面的代碼給了我以下輸出:

>>> a = Angle(322) 
>>> a 
322 
>>> b = Angle(488) 
>>> b 
488 

爲什麼地球上會發生這種情況?代碼對我來說似乎很微不足道,但也許我只是錯過了一些非常明顯的東西。

+1

可能重複的[Python:擴展int和MRO爲\ _ \ _ init \ _ \ _](http://stackoverflow.com/questions/1184337/python-extending-int-and-mro-for- init) – teferi

+0

好的,謝謝,添加一個自定義的'__new__'魔術方法完全解決了這個問題,並且很好地維護了代碼的其餘部分。謝謝! – user3002473

回答

3

你應該重寫__new__對一成不變的類如int

class Angle(int): 
    def __new__(cls, val): 
    val %= 360 
    inst = super(Angle, cls).__new__(cls, val) 
    return inst 

看到python datamodel更多信息

0

諮詢Python的對象接口的new方法。

__new__()主要用於允許不可變類型的子類(如int,str或tuple)自定義實例創建。它也是 通常在自定義元類中重寫以便自定義類 創建。