【问题标题】:How to define a variable of a class as class object in Python如何在Python中将类的变量定义为类对象
【发布时间】:2022-07-05 23:16:43
【问题描述】:

我需要定义一个类的变量一个类对象。我该怎么做?

例如,如果我有这样的课程:

class A:
  def __init__(self, a, b):
     self.a = a
     self.b = b

我想创建另一个 B 类,它有一个变量作为 A 类的实例:

class B:
  def __init__(self, c = A(), d):
     self.c = c
     self.d = d 

我该怎么做?当我创建 B 类的对象时,我需要做特定的操作或简单地将 c 声明为 A 类的对象?

【问题讨论】:

  • 在函数中执行:self.c = A()。默认值在定义函数时计算,而不是在调用时计算。
  • 您拥有的代码将创建 A 的单个实例,并使用相同的实例作为您创建的每个 B 实例的默认值。
  • 您好,欢迎来到 StackOverflow!是否要将A 的实例作为B.__init__ 的默认参数?

标签: python


【解决方案1】:
class B:
  def __init__(self, a, b, d):
     self.c = A(a, b)
     self.d = d

class B:
  def __init__(self, c, d):
     self.c = c
     self.d = d

class B:
  def __init__(self, d):
     self.c = A(a, b)      # a and b can be values
     self.d = d

【讨论】:

  • 可能需要更多解释,尤其是在最后一个(可能在其中提供一些实际文字,而不是使用 ab,因为它们尚未定义,因此无法使用)。关键是你不能只说A(),因为A.__init__ 需要两个参数。
【解决方案2】:

你写的大部分都有效:

    def __init__(self, c = A(), d):
        self.c = c

但是有一个你真的想要避免的“陷阱”。 A 构造函数将被评估一次, 在def 时间,而不是每次构建 一个新的B 对象。 这通常不是新手程序员想要的。 该签名提到了一个可变的默认参数, 通常最好避免的事情, 如果只是为了拯救未来的维护者 做一些令人沮丧的调试。

https://dollardhingra.com/blog/python-mutable-default-arguments/

https://towardsdatascience.com/python-pitfall-mutable-default-arguments-9385e8265422

相反,这样说:

class B:
    def __init__(self, c = None, d):
        self.c = A(1, 2) if c is None else c
        ...

这样A 构造函数每次都会被重新计算。 (另外,最好同时提供A 的两个强制参数。)

【讨论】:

  • “这不是你想要的” - 我认为你不能肯定地说,从问题中并不清楚意图是什么。
  • A() 将引发错误,因为它缺少 ab 参数。
  • 我更喜欢if c is not None: self.c = c 而不是self.c = c or ...。如果c 只能是某个类实例,通常在布尔上下文中为 True,这将可以正常工作,但更一般地说,它可以防止为 c 传递任何虚假信息,例如 0、空字符串或列表...
猜你喜欢
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多