首页 > 解决方案 > Python中的静态变量从另一个类设置值?

问题描述

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

标签: pythonpython-2.7

解决方案


似乎有些混乱。如果您运行,实际上是最新的形式:

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

实话说。你最好避免......因为它真的会让人感到困惑和令人惊讶,尤其是。当其他人开始处理您的代码时。它本质上打破了对对象的封装,并且变化的影响超出了立即显而易见的范围。linter 也会将其标记为问题。;)


推荐阅读