编辑: 好的,这是背景。我正在努力理解一个同事写的代码。他专门用这个例子的格式编写了代码:
>>> class A:
@staticmethod
def ok(abc):
thebigone=abc
(这是一个简化,但风格是一样的。也就是说,变量是在类中的@staticmethod
中声明的
因为我对他的代码不熟悉,所以我想看看thebigone
是什么类型的数据。我运行了函数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
的内容而不更改代码?如果不是,为什么?你知道吗
谢谢
赋值时,
THEBIGONE
是方法的本地命名空间中的变量(名称),而不是类的。你知道吗尝试
一般来说,在Python
where
中,赋值发生定义了名称结束的名称空间。你知道吗因此赋值
THEBIGONE = ...
使它进入当前名称空间,即方法的名称空间除非您明确指定名称应该放在哪里,例如
对象(在实例方法中通常称为
self
),具有self.THEBIGONE = ...
一个类,在您的例子中带有
a.THEBIGONE = ...
。请注意,正如trentcl的回答中所建议的那样,可以将方法设为classmethod
,并避免显式使用类名。等等
顺便说一句:类名应该以大写字母开头,使用大写字母惯例,变量保持小写。你知道吗
请参阅Python的PEP-8中描述的指南
不能在方法中自发地创建全局变量,正如不能在函数中自发地创建它们一样。否则,您将无法在静态方法中使用局部变量而不污染全局名称空间。你知道吗
除了Pynchia的解决方案之外,还可以在类外声明一个全局变量,并用
global
显式引用它:或者您可能希望使用classmethod使其成为类的成员:
类方法通常比静态方法更有用,因此请考虑这是否是解决实际问题的更好方法。你知道吗
相关问题 更多 >
编程相关推荐