无法在静态方法中查看变量

时间:2016-02-25 16:06:45

标签: python python-3.x

编辑: 好的,这是背景。我想了解同事写的代码。他专门用这个例子的格式编写了代码:

>>> class A:
        @staticmethod
        def ok(abc):
            thebigone=abc

(这是一种简化,但样式是相同的。即,变量是在类中的@staticmethod中声明的)

因为我是他的新代码,我想看看thebigone是什么类型的数据。我在shell中调用了函数并尝试使用它来返回此变量的内容。我运行了函数ok然后尝试使用shell来打印变量thebigone的内容,但是shell返回了一个定义错误。

以下是我在shell中尝试的命令:

>>> class A:
        @staticmethod
        def ok(abc):
            thebigone=abc


>>> A.ok('d')
>>> thebigone
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    thebigone
NameError: name 'thebigone' is not defined
>>> A.thebigone
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    A.thebigone
AttributeError: type object 'A' has no attribute 'thebigone'

运行该函数后,shell是否可以在不更改代码的情况下返回变量thebigone的内容?如果不是为什么?

由于

2 个答案:

答案 0 :(得分:2)

您不能在方法内自发创建全局变量,只能在函数内自发创建它们。否则,您将无法在静态方法中使用 local 变量而不会污染全局命名空间。

除了Pynchia的解决方案之外,您还可以在类外声明一个全局变量,并使用global显式引用它:

THEBIGONE = None
class a:
    @staticmethod
    def ok(abc):
        global THEBIGONE
        THEBIGONE = abc

或者您可能希望使用classmethod使其成为类的成员:

class a:
    @classmethod
    def ok(cls, abc):
        cls.THEBIGONE = abc

类方法通常比静态方法更有用,因此请考虑这是否可以更好地解决您的实际问题。

答案 1 :(得分:1)

在分配时,THEBIGONE是方法的本地名称空间中的变量(名称),而不是类。

尝试

a.THEBIGONE = ...

一般来说,在Python where中,赋值位置定义了名称最终的命名空间。

因此赋值THEBIGONE = ...使其进入当前命名空间,即方法的。

除非您明确指定名称的去向,例如

  • 使用self

  • 的对象(在实例方法中通常称为self.THEBIGONE = ...
  • 一个类,在您的情况下为a.THEBIGONE = ...。请注意,正如trentcl的回答中所建议的那样,您可以将方法设为classmethod并避免明确使用类名。

BTW:类名应以大写字母开头,使用CapWords约定,将小写字母留给变量。

请参阅Python PEP-8

中描述的指南