【问题标题】:trying to change the value of attribute of one class from another class but one value changes other value remains the same试图从另一个类更改一个类的属性值,但一个值改变了另一个值保持不变
【发布时间】:2020-10-26 19:47:17
【问题描述】:

我要做的就是每次从第一类调用更改函数时,将第二类的“a”的值设为负值。 我不想通过第二类的实例直接访问“a”变量。我只想通过不同的类来改变 'a' 的值。

class First():
    def __init__(self):
        self.value = 1
        self.s = Second(self)

    def change(self):
        trigger = input("continue? y/n?")
        self.value *= -1
        print(self.value)
        print(self.s.a)
        if trigger == "y":
            self.change()

class Second():
    def __init__(self, num):
        self.a = num.value

f = First()
f.change()

【问题讨论】:

  • 你能澄清你的问题,或者你想做什么?您可以分配给self.s.a。 “我只想通过不同的类来改变'a'的值”是什么意思?您的示例中没有“不同的类”。
  • self.a = num.value 是一个一次性事件。您检索了截至该特定时刻的num.value 的值,并将其分配给self.a。您没有设置任何类型的持续过程来保持这两个值同步。如果您真的不能只分配给self.s.a,则需要Second 保留对num 本身的引用,并让a 成为每次引用时检索num.value 的属性。跨度>
  • @MisterMiyagi 这不是我的实际代码。我的实际代码非常大而且复杂,我认为在这里发布会太长,所以我只是简化了不起作用的部分并以这种方式放置它,这样人们更容易通过它并解释我有什么问题。
  • @jasonharper 你能告诉我如何以编程方式进行。一个 sn-p 代码将非常有帮助
  • 我知道这是简化的代码(这很好),但它无法演示您想要做什么(这不好)。请edit您的问题更清楚地描述您想要做什么,可能使用代码来展示您想要的行为。

标签: python python-3.x class oop instance


【解决方案1】:

使 Second 类的 a 属性成为依赖于模块级变量的属性,First 类可以更改该变量而 Second 类。

class Thing:
    def __init__(self,val):
        self.val = val

class First():
    def __init__(self):
        self.value = 1
        self.s = Second()

    def change(self):
        trigger = input("continue? y/n?")
        self.value *= -1
        #print(self.value)
        #print(self.s.a)
        if trigger == "y":
            #self.change()
            num.val = -num.val

class Second():
    def __init__(self):
        #self.a = num.value
        pass
    @property
    def a(self):
        return num.val
    @a.setter
    def a(self,val):
        num.val = val

num = Thing(2)
f = First()
print(f'f.s.a = {f.s.a}')
f.change()
print(f'f.s.a = {f.s.a}')

该解决方案将使所有Second 实例具有相同的num,因此具有相同的a

也许您的意思是让每个 Second 实例拥有自己唯一的 a

class Thing:
    def __init__(self,val):
        self.val = val

d = {}

class First():
    def __init__(self):
        self.value = 1
        self.s = Second(2)

    def change(self):
        trigger = input("continue? y/n?")
        self.value *= -1
        #print(self.value)
        #print(self.s.a)
        if trigger == "y":
            #self.change()
            d[self.s].val = d[self.s].val * -1

class Second():
    def __init__(self,val):
        num = Thing(val)
        d[self] = num
    @property
    def a(self):
        return d[self].val
    @a.setter
    def a(self,val):
        d[self].val = val

f = First()
print(f'f.s.a = {f.s.a}')
f.change()
print(f'f.s.a = {f.s.a}')

【讨论】:

  • 为什么要添加额外的d?为什么不用self.num.val 而不是d[self].val
  • @MisterMiyagi 在第二种解决方案中,字典将(应该?)为每个 Second 实例保存一个单独的 Thing 实例,以便每个 Second 实例可以有一个不同的 a - 与第一个解决方案不同在我的回答中。
  • @MisterMiyagi - 我不确定是否满足 OP 的要求 - 我们拭目以待。
  • 但是每个Second 已经可以通过一个属性拥有一个不同的Thing 实例,例如self._num = hing(val)。使用一个全局的、外部的字典来保存每个实例的内部字典也可以保存的状态有什么好处?
  • @MisterMiyagi ... 嗯,IIUC 的 OP 想要更改 Second 实例中的 a 属性而不访问属性通过实例 - 所以我想第一个实例需要操作第二个实例依赖的模块级变量/事物的属性 - 希望这与问题一样有意义。
猜你喜欢
  • 2013-09-25
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-06
  • 1970-01-01
相关资源
最近更新 更多