【发布时间】:2021-10-20 14:04:33
【问题描述】:
几乎我想要做的是永久地改变一个类的变量从另一个类的函数,这可能吗?还是我必须创建一个新函数来专门处理它?
解释一下(在我的代码当前如何设置的一个非常简单的例子中):
class A():
def __init__(self, number):
self.number = number # for this example the number is 5 to begin with
self.dictionary = {(1, 0): 'a', (2,0): 'b'}
# ...some other code for the class
class B(): # note that B DOES NOT inherit from A
def __init__(self, number):
self._number = number
self._A = A(self._number)
def do_stuff(self) -> None: # it is a requirement to not return anything
number = self._A.number
dictionary = self._A.dictionary
# Printing them now would just give 5 and {(1, 0): 'a', (2,0): 'b'}
# what I want to do is something like this:
self._A.number = self._A.number + 5
# so that ANY time I use self.number from A() it will be 10
这是可以做到的事情吗?我读了一些关于公共变量和私有变量的内容(因此为什么在 A 中它们没有下划线,但在 B 中它们有),它说它们可以在课堂外更改和使用,但它似乎不起作用。
它只适用于那个函数,那个时间,那个做出改变的那个,而不是在后续的函数中,或者即使我再次调用同一个函数。
就像我稍后再次调用它们以从 B 中的另一个函数打印它们一样,它会打印 5 和 {(1, 0): 'a', (2,0): 'b'} 而不是 10 和 {(6, 0): 'a', (7,0): 'b'},就像我想要的那样。
对于任何想要了解我正在做什么的更多信息的人,我正在尝试在网格上设置一个二维游戏,其中一个类(相当于 A())仅处理网格中的实体作为将元组映射到字符表示的字典。另一个类(相当于 B())处理游戏的实际运行。我正在尝试执行此操作的特定功能应该将网格内实体的位置向左或向右改变一个位置,并且如果超出范围,还将其移动到屏幕的另一侧,以便当我稍后更改游戏的显示以匹配位置时,所有内容都将是左侧或右侧的一个位置。
【问题讨论】:
-
我无法重现这一点。在
B的同一实例上调用do_stuff()每次都会将_A.number的值提高5。您是否在每次运行的测试中都创建了B的新实例? -
真的吗?也许那时我正在创建一个新实例,或者我只是愚蠢,我昨晚凌晨 3 点就这样做了,所以这完全有可能。谢啦。编辑:刚刚弄清楚我在做什么,实际上每次测试时我都在创建一个新实例,我的错。在这种情况下,它应该可以正常工作,我认为,我认为我不必在任何时候创建 b 的新实例。再次感谢
标签: python python-3.x class