【问题标题】:varibles declared outside __init__ Python在 __init__ Python 之外声明的变量
【发布时间】:2021-09-13 18:25:37
【问题描述】:

为什么在 init 方法之外声明的变量不具有可加性属性? 例如我有以下课程:

class Trade:
    allTrades = []
    netPosition = 0

    def __init__(self, qty):
        self.quantity = qty

        self.allTrades.append(self.quantity)
        self.netPosition += self.quantity

allTrades(空列表)和netPosition变量定义在init方法之外,而数量变量定义在里面。

接下来,我创建我的类的 2 个对象并为它们中的任何一个打印 AllTrades 和 netPosition:

deal1=Trade('long', 50, 31)
deal2=Trade('long', 16, 39)

print(deal2.allTrades)
print(deal2.netPosition)

据我所知,allTrades (list) 变量是可加的,而 netPosition 不是: print(deal2.allTrades) 返回 [50, 16]。 print(deal2.netPosition) 返回 16 但我认为它应该返回 66

如何让print(deal2.netPosition) 返回 66 而不是 16?

【问题讨论】:

  • 列表是可变的,整数不是。

标签: python-3.x class variables init


【解决方案1】:

您的__init__ 函数创建了两个对象变量,它们是对同名类变量的引用。到目前为止一切顺利。

当您调用self.allTrades.append 时,您正在修改(或变异)您的allTrades 对象,该对象在您的类的所有对象之间共享。

当您执行self.netPosition += 时,您不会修改netPosition,因为数字是不可变的。相反,您将您的引用替换为另一个对 不同 数字对象的引用。这意味着您已经破坏了对象变量和类变量之间的联系。没有其他对象会看到这些更改。

要获得您所期望的,您需要将您的号码放入另一个可变对象中。

netPosition = [0]

self.netPosition = netPosition

self.netPosition[0] += self.quantity

【讨论】:

  • 这不仅仅是整数的不变性。从未创建名为 allTrades 的实例属性。相反,self.allTrades 解析Trade.allTrades 在没有该名称的实例属性的情况下。对于self.netPosition,情况有点棘手,但我认为结果是self.netPosition = Trade.netPosition.__iadd__(self.quantity),其中类属性用于生成一个值以分配给将隐藏类属性的新实例属性。
  • @chepner 你说得对,我在想象一个实际上并不存在的任务。我的错。
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多