Python中的静态变量是否从另一个类设置了值?

时间:2019-02-10 21:42:45

标签: python python-2.7

我在文件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”

2 个答案:

答案 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并不神奇地知道您要指的是什么名称空间。