python - 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”
解决方案
似乎有些混乱。如果您运行,实际上是最新的形式:
>>> 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 也会将其标记为问题。;)
推荐阅读
- c# - 作业服务无法执行方法
- azure-functions - 如何限制天蓝色函数的规模
- javascript - 如何设置新类不适用于 Bootstrap 和 jQuery?
- reactjs - 如何在 React 中创建编辑按钮?
- codeigniter - 如何在codeigniter中从数据库中检索检查值
- python - TensorFlow 2.0:你需要在每个函数之上添加一个 @tf.function 装饰器吗?
- java - 是否可以通过创建 1 个对象而不是多个对象来访问 Java 构造函数
- scala - 无法加载套件类。这可能是由于您的运行路径中的错误。缺少类 com.serviceyou.com.tests.ServiceYouTest
- android - 获取当前位置为 0.0, 0.0
- python - 如何在python中遍历复杂的json