必须在def __init__中声明所有Python实例变量吗?

时间:2012-09-05 03:39:21

标签: python instance-variables

或者他们可以另有声明吗?

以下代码不起作用:

class BinaryNode():
    self.parent = None
    self.left_child = None

是否需要在__init__声明?

4 个答案:

答案 0 :(得分:12)

它们不必在__init__中声明,但为了使用self设置实例变量,需要引用self,并且您需要的位置定义变量不会。

然而,

class BinaryNode():
    parent = None
    left_child = None

    def run(self):
        self.parent = "Foo"
        print self.parent
        print self.left_child

输出

Foo
None

在评论中回答你的问题,是的。在我的例子中,您可以说:

bn = BinaryNode()
bn.new_variable = "Bar"

或者,正如我所示,您可以设置一个类级变量。该类的所有新实例都将在实例化时获得类级变量的副本。

也许您不知道可以将参数传递给构造函数:

class BinaryNode(object):

    def __init__(self, parent=None, left_child=None):
        self.parent = parent
        self.left_child = left_child



bn = BinaryNode(node_parent, node_to_the_left)

答案 1 :(得分:2)

不。我喜欢这个@property变量:

class Data(object):
    """give me some data, and I'll give you more"""
    def __init__(self, some, others):
        self.some   = some
        self.others = others

    @property
    def more(self):
        """you don't instantiate this with __init__, per say..."""
        return zip(self.some, self.others)


>>> mydata = Data([1, 2, 3], ['a', 'b', 'c'])
>>> mydata.more
[(1, 'a'), (2, 'b'), (3, 'c')]

答案 2 :(得分:1)

所有Python实例变量都必须在def __init__中声明吗? 简短的回答:不。但这实际上取决于如何/在何处使用它们。

还是可以另外声明它们? 是的,可以用其他方式声明它们(不是实例变量)。由于您是在类中引用变量,因此,如果您不想使用使用__init__关键字的self构造函数,则可以在其中声明局部变量(例如)。

下面的代码不起作用:

class BinaryNode():
    self.parent = None
    self.left_child = None

不工作是什么意思?如果您指的是大多数开发人员如何使用类,那么您是对的,它无法正常工作,即您无法创建类对象(也称为类实例),然后在假定它们的情况下调用其实例变量之一正确声明(即:在充当构造方法的角色的 init 方法内部声明。)

换句话说:如果在构造函数方法 init 之外声明变量,则该变量称为类变量,而不是实例变量。 要启动实例变量,它必须位于 init 方法内,该方法实际上将构造(实例化)类实例(类对象)及其关联的实例变量(实例属性)。

例如:

如果您拥有parent = None而不是self.parent = None,则只需在类中创建一个局部变量。

因此,self一词在那里保留着调用类实例时被调用的地方,它代替了self传入。因此,self一词只是作为参数,用于放置一个地方,以传递我们要在其处调用的任何实例变量。因此self一词只是在这里提供帮助。

类似地,当创建一个类对象并说要创建一个实例变量时,必须使用属性词self(它不必是self,但是由于大多数python开发人员都在使用它,使用它已成为python的惯例和良好实践),它将作为参考(持有人)完成构造函数__init__的工作,该构造函数将分配传入类实例(对象)的参数值)创建为属于创建的类实例的实例变量副本的新值。

现在,让我们尝试另一种情况以更好地巩固这一概念:

如果我们使用__init__函数而不使用关键字self怎么办? 如果创建一个名为object_x的类对象,然后要从中调用其实例变量instance_y之一,则执行该程序,它将抛出一个错误,指出所创建的类对象确实没有属性(实例变量)。

它只是一个局部变量,定义时为其分配了任何值。

发生错误是因为当缺少参考字词self时,它不会将其识别为类内定义的实例变量之一。

答案 3 :(得分:0)

此外,您可以拥有类级变量,但我称之为类常量。

class Connection(object):
    """helps you connect to the server at work"""
    YOUR_IP = '10.0.9.99'

    def __init__(self, username, password):
        self.ip = Connection.YOUR_IP
        self.un = username
        self.pw = password

    #...and so on