提问人:jarlemag 提问时间:11/21/2020 更新时间:11/21/2020 访问量:185
如何在 Python 中模拟通过引用对象传递变量?[复制]
How can I emulate passing a variable by reference to an object in Python? [duplicate]
问:
我想创建一个 Python 类,它可以:
- 实例化时将变量作为参数
- 将变量的值存储在属性中
- 每当使用“update()”方法时,存储变量的当前值。
下面的代码没有按预期工作。如何通过方法调用更新属性的值,请记住它必须适用于任意变量?
class MyObject():
def __init__(self,data):
self.data = data
def update(self):
self.data = data
value = 0
dataobject = MyObject(value)
value = 1
dataobject.update() #NameError: name 'data' is not defined
答:
1赞
TSeymour
11/21/2020
#1
在 Python 中,int 和其他基本类型无法按照您想要的方式传递引用(列表和其他类型的对象有不同的故事,但我只会回答您提出的问题)。
我真的不推荐这种方法,但你可以使用 Global 关键字来做到这一点:
class MyObject():
def __init__(self,data):
self.data = data
def update(self):
global value # only change is this
self.data = value
value = 0
dataobject = MyObject(value)
value = 1
dataobject.update()
print(dataobject.data) # prints 1
Python 中的对象没有私有属性,因此您可以直接设置值:
dataobject.data = 1
这些都不是我认为最佳实践,但我必须更多地了解您正在尝试做什么,以便为您提供最佳建议。请注意,如果您计划拥有一堆 MyObject 实例,则尝试将它们与单个全局值同步可能会失控。我会建议一个新问题,其中包含有关您正在尝试做什么的更多信息,并且有人会给出最佳方法。
评论
1赞
jarlemag
11/21/2020
我已经考虑过“全局”,但这不会让我使用任意变量作为参数。出于同样的原因,我无法直接设置该值。该类的用途是表示一个 UI 元素来显示任意数据,这些数据需要保持最新。(确切地说,是 pygame 中 Sprite 类的子类。update() 方法为所有 Sprite 对象调用每帧)。
0赞
jarlemag
11/21/2020
这个问题已经关闭了,所以我不能把它添加为答案,但我现在(我认为)通过使用列表作为参数解决了它:class MyObject(): def __init__(self,data): self.myref = data self.data = self.myref[0] def update(self): self.data = self.myref[0]
0赞
rioV8
11/21/2020
如果出现以下情况,这将不起作用val2 = 5; do2 = MyObject(val2); val2 = 10; do2.update()
0赞
jarlemag
11/21/2020
@riov8:这里的代码似乎工作正常:pastebin.com/5iBJzNJV 你觉得它有什么问题吗?(或者也许我误会了你。不确定您是否在答案或我的问题中引用了代码)。
1赞
rioV8
11/21/2020
@jarlemag我参考了 TSeymour 的解决方案,如果你实现一个实现了运算符的类,那就更好了,python-reference.readthedocs.io/en/latest/docs/dunderdsc/......__set__
评论
id(0)