【问题标题】:Usage of self inside instance methods in Python在 Python 中使用 self inside 实例方法
【发布时间】:2018-11-14 19:10:48
【问题描述】:

我有这样的课

class Test:
    def __init__(self, var):
        self.var = var
    def test(self):
        x = self.var + 2
        return x

然后我做了一个这样的课程

class Test:
    def __init__(self, var):
        self.var = var
    def test(self):
        self.x = self.var + 2
        return self.x

我知道我可以使用self 来分隔此类不同实例的属性值。我的问题是,如果我在一个方法中创建了许多实用变量(如 x),我是否应该始终使用 self 创建它们?

谁能解释上述两个类的行为有何不同(如果有的话)?

【问题讨论】:

  • 不清楚你在问什么。第一个示例中的x 不是属性;它只是一个局部变量。除非您需要一个在方法调用中保持不变的值,否则最好使用局部变量。
  • 如果您要在多个方法中使用x 值,那么它应该绑定到self 并且self.x 的初始定义应该在@987654330 中完成@方法
  • @JacobIRR 我将只在一种方法中使用它。
  • 使用self 不会创建局部变量。如果你想要一个局部变量,值在方法结束时消失,那么使用局部变量(没有self)。如果你想要一个实例属性,在方法完成后值保留在实例上,那么使用实例属性(使用self)。
  • 这种情况下,不用self.

标签: python class oop object


【解决方案1】:

让我们看看这两个类的区别:

class Test:
    def __init__(self, var):
        self.var = var
    def test(self):
        x = self.var + 2
        return x

让我们创建一个测试对象:

t = Test(1)

看看我们能做什么

t.var # 1
t.x # Raises AttributeError : no such attribute in the class
t.test() #3
t.x # Still erroring

还有你的第二节课

class Test:
    def __init__(self, var):
        self.var = var
    def test(self):
        self.x = self.var + 2
        return self.x

让我们创建一个测试对象:

t = Test(1)

看看我们能做什么

t.var # 1
t.x # Raises AttributeError : no such attribute in the class
t.test() #3
t.x # 3

那又怎样?好吧,我们可以看到使用self.VARNAME 定义的任何变量都保留在实例中,而没有self. 的简单局部变量则不会。

但是,如果 x 需要通过 t.x 访问,我可能会选择一个属性,就像这样

class Test:
    def __init__(self, var):
        self.var = var

    @property
    def x(self):
        x = self.var + 2
        return x

t = Test() 
t.x # 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2011-05-19
    • 2012-08-18
    • 2013-11-08
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多