【问题标题】:How do I create a class-wide, manipulable variable in Python? [duplicate]如何在 Python 中创建一个类范围的可操作变量? [复制]
【发布时间】:2019-07-15 21:28:28
【问题描述】:

这里是相对较新的 Python 程序员。所以我试图创建一个变量,该变量可以通过在构造函数中初始化的类中的任何方法访问和更改。到目前为止,我无法弄清楚如何做到这一点。

作为解决问题的“创可贴”,我在课堂上的每个变量之前都使用了“self”。当然,还有另一种方法。

例如:

class Image:
    height, width = 0,0

    def __init__(self, heightInput, widthInput, pixelValue):
        height = heightInput
        width = widthInput

    def readHeight:
        print(height)

testObj = Image(10, 10, 20)
testObj.readHeight()

我希望输出为“10”,但会抛出“高度”不是变量的错误。我还有很多类似的问题,但本质上我想知道是否有任何方法可以避免使用“自我”这个词。谢谢!

【问题讨论】:

  • “作为解决问题的“创可贴”,我在课堂上的每个变量之前都使用了“self”。当然,还有另一种方法。”不,没有。你必须使用self
  • self 不是创可贴的解决方案。从字面上看,这是区分类属性和同名全局变量的唯一方法
  • 您刚刚将heightwidth 局部变量设置为__init__ 方法。您应该阅读 OOP 的工作原理。
  • 是的,我明白了。 “区分类属性和具有相同名称的全局变量的唯一方法”我的问题是,我应该有一个唯一的全局变量(在方法外部声明),如何从方法内部访问它?例如,我将如何访问宽度和高度的类变量?那是我的问题。
  • @GreyAycock 是的,你已经有了答案,你使用self.my_var

标签: python python-3.x variables self


【解决方案1】:

heightwidth 是经典变量,它们只存在于您的 __init__ 方法中,要解决这个问题,您必须改用 self.heightself.widthself 指向当前对象,这是绑定对象的方式。

编辑:您应该阅读一些有关 Python OOP 的文章,该语言有一些独特之处。例如,一个 Python 类有 1 个构造函数 __new__ 和 1 个初始化函数 __init__。第一个实际上是一个构造函数,因为当你进入它时实例还不存在,它的返回值主要是需要的实例。然后 Python 会自动调用构造函数返回的对象的 __init__ 方法,这是您构建实例属性的地方。当然,您可以直接从__new__ 绑定属性,但__init__ 就是为了这个。

【讨论】:

  • 哈哈打败了我。
  • 嗯,是的,这就是我一直在做的事情,但是我想知道是否还有其他方法可以做到这一点。当然不是所有的 Python 程序都充满了无数的“自我”,对吧?
  • 是的,不像 C# 这样没有强制执行的语言
  • 另外,在任何方法之外声明高度和宽度变量的意义何在?它们只是作为最终整数吗?
  • 我编辑了我的答案以添加一些解释
【解决方案2】:

正如 Shizzen83 所说,self 指的是类对象的实例。 因此,将在整个课程中使用的任何变量都需要以“self”开头。

def __init__(self, heightInput, widthInput, pixelValue):
    self.height = heightInput
    self.width = widthInput

def readHeight:
    print(self.height)

这就是你要找的。​​p>

【讨论】:

  • 为代码添加解释使答案更有用。
  • 感谢提醒,已编辑。
猜你喜欢
  • 2010-12-30
  • 2012-07-07
  • 1970-01-01
  • 2011-01-01
  • 2018-05-04
  • 2019-05-22
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多