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

2024-05-15 01:55:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

>>> 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的内容而不更改代码?如果不是,为什么?你知道吗

谢谢


Tags: 函数代码内容mostdefokshellcall
2条回答

赋值时,THEBIGONE是方法的本地命名空间中的变量(名称),而不是类的。你知道吗

尝试

a.THEBIGONE = ...

一般来说,在Python where中,赋值发生定义了名称结束的名称空间。你知道吗

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

除非您明确指定名称应该放在哪里,例如

  • 对象(在实例方法中通常称为self),具有self.THEBIGONE = ...

  • 一个类,在您的例子中带有a.THEBIGONE = ...。请注意,正如trentcl的回答中所建议的那样,可以将方法设为classmethod,并避免显式使用类名。

  • 等等

顺便说一句:类名应该以大写字母开头,使用大写字母惯例,变量保持小写。你知道吗

请参阅Python的PEP-8中描述的指南

不能在方法中自发地创建全局变量,正如不能在函数中自发地创建它们一样。否则,您将无法在静态方法中使用局部变量而不污染全局名称空间。你知道吗

除了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

类方法通常比静态方法更有用,因此请考虑这是否是解决实际问题的更好方法。你知道吗

相关问题 更多 >

    热门问题