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

问题描述 投票:4回答:4

或者他们可以另外声明?

以下代码不起作用:

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

他们需要在__init__宣布吗?

python instance-variables
4个回答
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)

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')]

1
投票

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

或者他们可以另外声明?是的,否则可以声明它们(不是实例变量)。因为你在类中引用变量,所以如果你不想使用使用关键字__init__self构造函数,你可以在其中声明一个局部变量(例如)。

以下代码不起作用:

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

你不工作是什么意思?如果你指的是大多数开发人员如何使用一个类,那么你是对的,它不起作用,你不能创建一个类对象(它也称为类实例)然后调用它的一个实例变量假设它们声明正确(即:在init方法中声明INSIDE,它扮演构造函数方法的角色。)

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

例如:

如果你有parent = None而不是self.parent = None你刚刚在你的类中创建了一个局部变量。

因此,当你调用类实例时,self这个词就是为了保留它的位置,它代替了self。因此,self这个词只是作为一个参数来保存一个地方,用于传递我们想要在其位置调用的任何实例变量。所以self这个词只是在这里做一个优惠服务。

类似地,当创建一个类对象并且想要创建一个实例变量时,你必须使用属性词self(它不一定是self,但是因为大多数python开发人员使用它,使用它成为一个惯例和一个很好的实践python)它将作为一个引用(一个持有者)来完成构造函数__init__的工作,它将传递的参数值传入创建的类实例(对象)作为属于的实例变量副本的新值创建的类实例。

现在,让我们尝试另一种方案来更好地巩固这个概念:

如果我们使用__init__函数但不使用关键字self怎么办?如果你创建一个名为object_x的类对象,然后你想从它调用一个名为instance_y的实例变量,那么你执行程序,就会抛出一个错误,说创建的类对象没有属性(实例变量) 。

它只是一个局部变量,具有您在定义它时分配给它的任何值。

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


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
© www.soinside.com 2019 - 2024. All rights reserved.