2013-02-11 29 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

相关问题