所以我有一个类,我将其用作本地命名空间。我在类中有一些静态函数,但它们无法访问类范围变量。这是为什么?
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
有什么想法吗?
答案 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()