python - Python 中实例方法内部 self 的用法

标签 python class oop object

我有一堂这样的课

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

然后我做了一个这样的类(class)

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

我知道我可以使用 self 在此类的各个实例之间分隔属性值。我的问题是,如果我在方法内创建许多实用程序变量(例如 x),我是否应该始终使用 self 创建它们?

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

最佳答案

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

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

关于python - Python 中实例方法内部 self 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53307214/

相关文章:

javascript - 使用默认值时调用静态方法

python - 将python列表复制到numpy数组时,如何防止TypeError : list indices must be integers, not tuple?

python - 如何在 Python 中将正数转换为负数?

python - 从不等长的嵌套列表创建 Pandas 数据框

c++ - 类范围问题的 vector ?

javascript - 多个按钮的一种功能

c# - Haskell 中的 OOP 样式继承

python - 如何在没有任何第三方库的情况下比较两个 2-dim 数组的列?

c++ - __device__ 类成员函数更改设备变量的值后从设备复制到主机时出现 cudaMemcpy 错误

python - 如何在 Python 的类中创建列表或集合对象?