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

2024-06-07 22:18:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在文件api.py中有一个类,它包含属性:

class API(object):
    api_key = ''
    def add_advert(self):
        print(self.api_key)

在另一个类中,我使用上面的import类:

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' object has no attribute 'api_key'


Tags: keyimportselfaddapinew属性object
2条回答

首先,不要让变量名成为文件的导入名的阴影。将api变量更改为api_var等其他变量。然后,使用api_var.api_key,或者如果导入API类,API.api_key。您需要引用实例或类来获取类/静态变量。Python无法神奇地知道您所指的名称空间是什么。你知道吗

似乎有点混乱。实际上,如果您运行:

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

实际上,它们都指向同一个对象(list的实例)。你知道吗

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

老实说。你最好避免。。。因为它真的会让人困惑和惊讶,尤其是当别人开始编写你的代码时。它实质上打破了对象的封装,改变的影响超出了显而易见的范围。过梁也会将其标记为问题。;)

相关问题 更多 >

    热门问题