2013-02-11 60 views
4

我建立具有其值在實例化是隨機生成的屬性的對象。該屬性會隨時分配一個新的值(也是隨機的),所以我正在定義一個方法來做到這一點。通過從__init__內調用該方法來初始化屬性是否是不好的形式?這很容易避免 - 我只需要複製少量的代碼 - 但調用方法似乎更加優雅。這裏是一個例子:從該實例的__init__方法中調用實例方法是不是很糟糕的形式?

import random 

class Robot(object): 
    def __init__(self): 
     self.setDirection() 

    def setDirection(self): 
     self.direction = random.random() * 360 
+3

不,這是不壞的形式這樣做。方法(setDirection)是一個幫助類的功能,如果它需要幫助類在init或任何其他階段實現其目的。 – 2013-02-11 15:29:01

+0

可能重複:http://stackoverflow.com/questions/3091833/calling-member-functions-from-a-constructor – 2013-02-11 15:30:42

+0

有不同的順序比預期正在得到初始化由於事情錯誤的機會,但只要因爲輔助方法不依賴於對象的任何狀態,所以你應該很好。 – millimoose 2013-02-11 15:32:59

回答

7

它的優良調用內__init__實例方法,但要小心,如果他們可能在子類中重寫:

class A(object): 
    def __init__(self): 
     self.greet() 
    def greet(self): 
     print('Hello from A') 

class B(self): 
    def __init__(self, name): 
     super(B, self).__init__() 
     self.name = name 
    def greet(self): 
     print('Hello from B', self.name) 

在這種情況下B.greetA.__init__稱爲它的前提條件被滿足之前(self.name沒有定義) 。

1

__init__內調用其他實例方法沒有任何問題。


注意的是Python有實例方法class methods之間的區別。我想不出一個很好的理由使用內__init__一個類方法 - 這是不是說,一個很好的理由不存在,但該病例很可能是非常罕見的。

+0

感謝您的幫助!我將編輯標題以反映這一點(希望我能理解)。 – ivan 2013-02-11 15:32:57

相關問題