如何在没有self的情况下访问类范围变量?

时间:2012-10-23 19:05:37

标签: python class static scope

所以我有一个类,我将其用作本地命名空间。我在类中有一些静态函数,但它们无法访问类范围变量。这是为什么?

class Foo:
    foo_string = "I am a foo"

    @staticmethod
    def foo():
        print foo_string

>>> Foo.foo()
  [Stack Trace]
  NameError: global name 'foo_string' is not defined

有什么想法吗?

2 个答案:

答案 0 :(得分:12)

Python不允许类变量以这种方式落入范围,有两种方法可以做到这一点,第一种是使用类方法:

@classmethod
def foo(cls):
    print(cls.foo_string)

我认为这是最好的解决方案。

第二种是按姓名访问:

@staticmethod
def foo():
    print(Foo.foo_string)

请注意,通常情况下,使用类作为命名空间并不是最好的方法,只需使用具有顶级函数的模块,因为这样可以更好地执行操作。

缺乏这样的范围的原因主要是由于Python的动态特性,当你将一个函数插入类时它会如何工作?它必须有条件地添加特殊行为,这将非常难以实现并且可能非常脆弱。它还有助于保持事物的显性而不是隐式 - 很清楚什么是类变量而不是局部变量。

答案 1 :(得分:-1)

Python是通用语言,您甚至可以更改语法,但这明智吗? 有一种解决方案:

class test():

    def __init__(self, **args):
        for a in args.keys():
            setattr(self, a, args[a]) #store a given variable name and corresponding value

    def __call__(self, function):
        ''' run functions by using object's namespace, when object is called'''

        # run a code described in self.function by using namespace self.__dict__
        exec(getattr(self, function).__code__, self.__dict__)

    def testA():
        '''
        * Special function without self as argument
        * Using namespace described in self.__dict__
        * Can not return anything
        * Call by command self('testA') or <class>('testA')
        '''
        print(name)

    def testB(self):
        self('testA') # Call function testA




prog = test(name = 'python')
prog('testA') # Function testA prints python
prog.testB() # Function testB calls testA
input()