python:var vs. self.var(有什么区别?)

时间:2013-11-25 22:34:46

标签: python class variables

self.var和类中的var之间有什么区别吗? 例如:

class nameClass:
    def names(self):
        self.name1 = "aaaa"
        name2 = "bbbb"

    def printNames(self):
        print self.name1
        print name2

现在如果我实例化该类并且我想使用name2变量,它就不会让我。

 obj1 = nameClass()
 obj.printNames()

它会打印name1但是对于name2,它会显示:

NameError: global name 'name2' is not defined 

所以我假设我们在一个方法中使用的变量最好不要使用' self' 但对于我们想要稍后修改的其他变量或将其传递给其他方法,最好使用' self'。

还有其他区别吗?!

enter image description here

2 个答案:

答案 0 :(得分:6)

class Foo:
    name1 = 'class variable'

    def __init__(self):
        self.name2 = 'instance variable'
        name3 = 'local variable'

    def test(self):
        print self.name1  # ok
        print self.name2  # ok
        print name3       # no

以下是相关帖子:Static class variables in Python

答案 1 :(得分:2)

name2 = "bbbb"变量只是方法names的本地变量。在您将其设置为names方法的末尾后,名称将会显示。

但是使用self.name1 = "aaaa",您将为您的类实例self添加一个属性,这将属于您的self实例的其他方法。

因此,对于您必须在类中存储更长时间的任何数据,使用self.xyz,并且需要在方法之间访问,并在单个方法中使用xyz作为临时变量。

Offtopic:在使用之前,请小心初始化每个局部变量。如果你没有,你可以在较低级别拥有一个同名的(全局)变量,而你会使用它的值,而你的代码会搞乱。

在使用self之类的属性时也要小心,不要忽略name1,因为您可以再次使用全局变量name1,而是在类方法中读取它。

说明这些令人讨厌的错误:

def test():
    # forgot to initialize constant/variable x
    print x

x = 1
test()

class CTest:
    def __init__(self):
        self.x = 5

    def wrongx(self):
        print x

t = CTest()
t.wrongx()

此测试的输出将为:

1
1