编辑: 好的,这是背景。我想了解同事写的代码。他专门用这个例子的格式编写了代码:
>>> 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
的内容?如果不是为什么?
由于
答案 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
中描述的指南