【问题标题】:python: var vs. self.var (what are the differences?)python: var vs. self.var(有什么区别?)
【发布时间】:2013-11-25 22:34:45
【问题描述】:

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'。

还有其他区别吗?!

【问题讨论】:

    标签: python class variables


    【解决方案1】:
    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

    【讨论】:

    • 可能想为您的print 方法选择一个不同的名称,因为当前的方法会抛出一个SyntaxError。 ;)
    • @iCodez.. 抱歉,fogot print 已保留。射自己的脚
    【解决方案2】:

    name2 = "bbbb" 变量将仅是方法 names 的本地变量。名称将在您设置后可见,直到您的 names 方法结束。

    但是使用self.name1 = "aaaa",您将向您的类实例自身添加一个属性,您的self 实例的其他方法将知道该属性。

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

    题外话:在使用之前小心初始化每个局部变量。如果你不这样做,你可以在较低级别有一个同名的(全局)变量,而你会使用它的值,你的代码会搞砸。

    在使用name1 之类的属性时也要注意不要省略self,因为您可以再次拥有全局变量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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2011-06-01
      相关资源
      最近更新 更多