2012-11-13 18 views
1

Some things如果我在課堂上使用__init__而不是init__,則不起作用。我只是好奇這兩者之間的區別是什麼。python類中的init__和__init__有什麼區別?

這是一堂課。但它真的沒關係,因爲它與init__一起使用,它不與__init__。我知道這是一個打字錯誤,那麼這意味着我可以以任何方式實際調用它。

class Point(namedtuple('Point', 'x, y, z')): 
    'class of a point as a tuple array' 
    __slots__ =() # prevent creation of instance dictionaries to save memory 

    def init__(self, x, y, z): 
    self.x = x 
    self.y = y 
    self.z = z 

    def __del__(self): 
    'delete the Point' 

    def __repr__(self): 
    'Return a nicely formatted representation string' 
    return '[%r, %r, %r]' % (self) 

    def __str__(self): 
    'printing format' 
    return '%s[%r, %r, %r]' % (self.__class__.__name__, 
           self.x, self.y, self.z) 

    def __add__(self, other): 
    return Point(self.x + other.x, self.y + other.y, self.z + other.z) 

    def __sub__(self, other): 
    return Point(self.x - other.x, self.y - other.y, self.z - other.z) 

    def __mul__(self, scal): 
    'multiplication ny scalar' 
    return Point(self.x * scal, self.y * scal, self.z * scal) 

    def __div__(self, scal): 
    'division ny scalar' 
    if scal != 0.0: 
     return Point(self.x/scal, self.y/scal, self.z/scal) 
    else: 
     sys.exit('Division by zero!') 

我的問題有「如何在兩種不同的方式實例化一個對象?」這種方式完美地工作。

如何解釋?

+0

向我們展示您的課程。 – alexvassel

+0

[Python \ _ \ _ init \ _ \ _和自己可能重複的是什麼?](http://stackoverflow.com/questions/625083/python-init-and-self-what-do-they-do ) –

+0

@Martijn不,這不是一個可能的重複,就像在關閉對話框中定義的那樣。它不包括*完全相同的內容。你自己對這個問題的回答,如果作爲對相關問題的答案進行合併,將不會以任何令人滿意的方式回答它,它只會看起來不合適,並使讀者感到困惑。 –

回答

10

__init__是用來初始化您的實例掛鉤。 (它在創建實例時總是被調用)。

init__僅僅是一個類的方法有靠不住的名字。

您需要向我們展示您的代碼;如果你有一個名爲__init__的方法,那麼你在那裏犯了一個錯誤。將它重命名爲init__意味着它不會被自動調用,從而不會觸發您的編碼錯誤。

comment you refer to,筆者使用__init__在他的評論卻忘了逃跑的前導下劃線,他們被解釋爲代碼開始,而不是粗體文字:

__this is bold__ 

變得這是大膽。請注意,尾註____main__丟失在該評論。

在你更新的代碼,你想覆蓋元組(子類),這是一種特殊情況的__init__方法。通過將__init__方法重命名爲init__,您創建了不同的方法,並且根本沒有遇到這個常見問題。

關於爲什麼這是一個問題,更詳細見Subclassing Python tuple with multiple __init__ arguments;您必須改爲創建一個__new__方法。 __new__是創建實例的工廠方法,然後__init__初始化數據。但是這不適用於不可變的類型,例如namedtupletuple,因爲在工廠創建它之後不應該更改實例。

在這種特定的情況下,你根本就不因爲namedtuplePoint已經採取xyz屬性的初始化工作需要一個__init____new__方法。通過將__init__重命名爲init__,您可以使其工作,但最終會產生一個永遠不會使用的毫無意義的init__方法。只要刪除它。

+0

我明白了,謝謝。最後一段解釋了一切。 – Olexandr

3

init__在Python中沒有任何特殊含義。這只是一種方法。

__init__是一個神奇的方法對對象實例化自動調用。

如果init__的作品,但__init__沒有,那麼什麼是你的代碼破 - 可能是在該方法中,因爲如果它被稱爲init__它幾乎肯定從來沒有得到所謂的。

2

__init__是一種特殊的方法,當創建類的新對象時總是調用它。當你想要定義附加屬性或以某種方式改變對象的行爲時,它只應該被重載。

相關問題