【问题标题】:Why isn't self used for class variables outside class methods? [duplicate]为什么 self 不用于类方法之外的类变量? [复制]
【发布时间】:2012-11-08 23:36:23
【问题描述】:

可能重复:
Python ‘self’ explained

我是编程和 python 的新手。我理解在类方法中使用self 并声明类变量,但是,我的问题是:为什么self 不用于在类方法之外声明变量?已经在另一个帖子中回答了。

【问题讨论】:

  • 你能举例说明你的意思吗? “类变量”和“类方法”可能并不意味着你认为它们在 Python 中的作用。
  • 你有 JavaScript 的背景吗? (只是一种预感)在那种情况下,你必须对对象有不同的看法......
  • self 通常是类方法被调用时的第一个参数的名称,它引用的是类的 instance 而不是类本身。类也是对象,但它们的类被称为元类——您可能还不需要关心这一点。要引用类属性,您可以只使用类的名称,即My_class.attrib

标签: python class variables


【解决方案1】:

self 不用于在任何地方声明变量。 self 是方法的第一个参数的常用名称,因为该方法接收它所绑定的实例作为每个调用的第一个参数。

它没有在“其他地方”使用,因为它仅适用于存在可绑定实例的上下文。

你可能在想这样的事情:

class Foo(object):
    y = 1
    x = self.y * 2

这是不可能的,因为没有self - 事实上,在评估类语句的主体时,还没有实例或类对象存在。也没有必要,因为可以直接引用正文范围内的其他变量,而无需使用self

请注意,对 self 成员的赋值和对类范围内变量的赋值有两种不同的作用:

class Foo(object):
    y = 1 # class variable
    def __init__(self):
        self.x = self.y * 2 # instance variable, defined by reference to class variable

first = Foo()
Foo.y = 2
first.y = 3
second = Foo()
print first.x # = 2
print second.x # = 4

【讨论】:

  • 我想我混淆了两个概念。在 init 方法中,我使用 self.Foo = 3 但不在方法中时我只会使用 foo = 3。这让我感到困惑
  • @AaronBooher 原因在这个答案中解释:您必须在方法中使用self 来引用实例,但在方法之外没有实例可以引用。
【解决方案2】:

此链接 (http://www.python.org/doc/essays/ppt/acm-ws/sld051.htm) 可能会为您提供一些关于类变量与实例变量的说明,我相信您正在询问这些变量。看看那个页面和对应的下一张幻灯片。

如果这不能澄清你的要求,就类方法而言,我不确定我是否知道你指的是什么。我建议阅读“classmethod”(http://docs.python.org/2/library/functions.html#classmethod)和“staticmethod”(http://docs.python.org/2/library/functions.html#staticmethod

【讨论】:

  • 也就是说,每个实例的类变量都是相同的,而实例变量会根据实例的创建时间而变化
【解决方案3】:

self 是一个约定 - 不是 Python 的保留字。常规方法声明中的第一个参数表示对象。然而,为了代码的可读性和一致性,不要在类之外使用 self 是一种传统观念。

一般来说,您可以使用任何单词作为变量标识符,但变量名称隐含地包含在代码文档中,因此最好使用尽可能不言自明的名称变成 5-12 个符号(这些是我的偏好) - 它们可能会更长,但是太长的名称会使您的代码混乱。

self 在类之外是没有意义的——它不会帮助代码阅读者理解代码。因此,您可以根据需要使用它——但这不是一个好主意。

【讨论】:

    猜你喜欢
    • 2019-12-02
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2019-12-06
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多