【问题标题】:Class instance variable assigned inside function函数内部分配的类实例变量
【发布时间】:2021-10-02 22:39:49
【问题描述】:

可以将类实例变量设置为等于在函数内创建的另一个类的类实例变量吗?在调用func() 之后,下面的代码似乎可以工作(a.var = [5, []]),但我想确保我没有遗漏任何东西:

def func():
  class C:
    def __init__(self):
      self.var = [[] for _ in np.arange(2)]
  c = C()
  c.var[0] = 5
  a.var = c.var

class A:
  def __init__(self):
    self.id = 0
    self.var = [[] for _ in np.arange(2)]

if __name__ == "__main__":
  a = A()
  func()

【问题讨论】:

  • 如果名称 a 在给定范围内可用且可访问,则分配给绑定到名称(即a.var)的属性将起作用。 func 可以看到其外部范围的 a,因为它在任何地方都没有本地定义的 a(即范围内没有 a = ... 语句)。更多相关信息请参考this thread和this thread。

标签: python function class instance-variables


【解决方案1】:

是的,您只是在分配对象。现在,你应该非常小心你写这个的方式。依赖你设定的范围是个坏主意——它会起作用,但我很容易看到有人忘记了“a”,而且它永远不会被传递给 func()。在我看来,一个更好的 func 实现:

def func(a, val=5):
  class C:
    def __init__(self):
      self.var = [[] for _ in range(2)]
  c = C()
  c.var[0] = val
  a.var = c.var

class A:
  def __init__(self):
    self.id = 0
    self.var = [[] for _ in range(2)]

if __name__ == "__main__":
  a = A()
  func(a)
  aa = A()
  func(aa, val=10)

由于列表可以包含任何对象,你可以做一些更奇怪的事情,比如。

aa.var[1] = a

【讨论】:

  • 我不会将a 传递给func(),因为func() 无论如何都可以访问它。我想保持写作简单,所以设置c.var[0] = 5。在实际代码中val 是func() 内部大量计算的结果(因此它不像将值5 传递给func() 那样简单)。事实上 a 是一个 3D 嵌套列表,c 是一个 2D 嵌套列表,我在函数内部迭代地分配 a[i] = c
  • @csankar69 我认为没有任何理由不传递“a”类实例,不传递它既不可读也更危险。不知道你希望 val 有多硬编码,只是提出一个建议,但如果它是你想要更多暴露的一些广泛计算的结果,你总是可以将它作为回调传递或传递一些 kwargs什么的。
  • 同意,我的设置是一种简单的设置,其中我在整个代码中创建了一个 class A 对象数组,然后再也不会。 A 的变量比 C 多得多,我使用 func() 和 C 仅分配 A's 变量之一。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-05-30
  • 2022-11-27
  • 1970-01-01
  • 2016-01-23
  • 2020-04-07
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多