【问题标题】:Global variable Python classes全局变量 Python 类
【发布时间】:2011-06-25 02:00:59
【问题描述】:

在python中定义具有类范围的全局变量的正确方法是什么?

来自 C/C++/Java 背景,我认为这是正确的:

class Shape:
    lolwut = None

    def __init__(self, default=0):
        self.lolwut = default;
    def a(self):
        print self.lolwut
    def b(self):
        self.a()

【问题讨论】:

  • 如果下面的答案是正确的,你应该接受它

标签: python global-variables


【解决方案1】:

您所拥有的是正确的,尽管您不会将其称为全局,但它是一个类属性,可以通过类(例如 Shape.lolwut)或通过实例(例如shape.lolwut 但在设置时要小心,因为它会设置实例级属性而不是类属性

class Shape(object):
    lolwut = 1

shape = Shape()

print Shape.lolwut,  # 1
print shape.lolwut,  # 1

# setting shape.lolwut would not change class attribute lolwut 
# but will create it in the instance
shape.lolwut = 2

print Shape.lolwut,  # 1
print shape.lolwut,  # 2

# to change class attribute access it via class
Shape.lolwut = 3

print Shape.lolwut,  # 3
print shape.lolwut   # 2 

输出:

1 1 1 2 3 2

有人可能期望输出为1 1 2 2 3 3,但这是不正确的

【讨论】:

  • 我在python 2.7中测试你的例子,没关系。但是当你第一次为Shape.lolwut设置值时,实例值将被改变。一旦你为实例属性设置值,即使你改变了类级别的值,两者也不会相同,就像你的例子一样。
  • @Danyun 我也测试过。我看到了和你说的一样的情况。你知道为什么会这样吗?当您从类级别更改属性时,也会更改实例。但是当你先更改实例级别,然后从类级别更改时,它不会再次影响实例。
  • @user1167910 参考python文档docs.python.org/2.7/reference/datamodel.html,你会发现'属性赋值和删除更新实例的字典,而不是类的字典'
  • 所以意思是……在全局变量中创建实例对你没有帮助,而只有直接改变类中的变量才能达到设置'全局变量'的目的?
  • 如果我从多个线程或文件中导入形状会发生什么?变量 lolwut 是否仍然是全局的(跨线程通用)?
猜你喜欢
  • 1970-01-01
  • 2021-03-13
  • 2019-07-24
  • 2015-08-19
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
相关资源
最近更新 更多