我在文件api.py
中具有包含属性的类:
class API(object):
api_key = ''
def add_advert(self):
print(self.api_key)
在另一个类中,我使用上面的导入类:
import api
api = api.API()
然后在类中,我尝试将值写入属性api_key
:
api.api_key = 'NEW VALUE'
因此,当我从api
类中调用另一个方法时:
api.add_advert()
它不会为我返回api_key
的新值:
def add_advert(self):
print(self.api_key)
我的最终代码是:
import controller.api
apiClass = controller.api.API()
当我尝试设置时:
apiClass.api_key = 'NEW VALUE'
它给了我:
“ NoneType”对象没有属性“ api_key”
答案 0 :(得分:1)
似乎有些混乱。如果运行,实际上是最新形式:
>>> from api import API
>>> myapi = API()
>>> myapi.add_advert()
>>> myapi.api_key='xxx'
>>> myapi.add_advert()
xxx
听起来像您想要的。那有错字吗?还是这个问题缺少什么?
更广泛的问题。不,没有这样的静态类属性(或变量)……但是可变对象的行为给了您从其他语言中获知的行为(当人们偶然偶然发现它时,有时会使人们感到困惑)。使用:
class C:
mutable_attr = []
您可以尝试:
>>> c1 = C()
>>> c2 = C()
>>> c1.mutable_attr.append('foo')
>>> c2.mutable_attr
['foo']
实际上,它们都引用相同的对象(列表的实例)。
>>> c1.mutable_attr is c2.mutable_attr is C.mutable_attr
True
但是,直接分配给属性(而不是操纵该对象),“魔术”消失了:
>>> c1.mutable_attr = ['bar']
>>> c2.mutable_attr
['foo']
这是切线的,但是使用函数会更加有趣。如果使用可变类型作为默认值,则在定义函数(未调用)时将其分配给变量,并且每次调用该类型时都使用该默认值,仍然是一个对象:
def f(x=[]):
x.append(1)
print(x)
然后:
>>> f()
[1]
>>> f(['a'])
['a', 1]
>>> f()
[1, 1] # back to the original (default) object for appending
老实说。您最好避免两者之一...因为它确实会使您感到困惑和惊奇。当其他人开始处理您的代码时。它本质上破坏了对象的封装,更改的影响超出了立即显而易见的范围。短绒棉也会将其标记为问题。 ;)
答案 1 :(得分:0)
首先,不要让变量名隐藏文件的导入名。将api
变量更改为类似api_var
的变量。然后,使用api_var.api_key
,或者如果您导入API类,则API.api_key
。您需要引用实例或类以获取类/静态变量。 Python并不神奇地知道您要指的是什么名称空间。