13

或者可以以其他方式声明它们吗?

下面的代码不起作用:

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

他们需要在 中声明__init__吗?

4

4 回答 4

13

它们不必在 中声明__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)
于 2012-09-05T03:40:48.907 回答
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')]
于 2012-09-05T03:48:11.880 回答
2

必须在 def 中声明所有 Python 实例变量__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,然后你执行程序,它会抛出一个错误,指出创建的类对象没有属性(实例变量)。

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

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

于 2018-07-24T17:27:13.103 回答
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
于 2012-09-05T03:52:48.460 回答