【问题标题】:Is there a way to change the self variables from a class init in another class?有没有办法从另一个类的类初始化中更改自变量?
【发布时间】: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


【解决方案1】:

是的,应该是可能的。我用上面的代码进行了测试:

b = B(5)
assert b._A.number == 5
b.do_stuff()
assert b._A.number == 10

它似乎按预期工作。为了稍微简化,我还建议更改此设置:

self._A.number = self._A.number + 5 

到这里:

self._A.number += 5 

【讨论】:

  • 是的,你是对的,事实证明,当我测试它时,我睡眠不足的大脑只是在创建 b 的第二个实例(凌晨 3 点正在处理这个问题,这样做是个坏主意)。感谢大侠的帮助
  • 哈哈,没问题。是的,我不建议编码到深夜:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多