【问题标题】:How to initialize static member based on constructor args?如何根据构造函数参数初始化静态成员?
【发布时间】:2016-06-14 21:39:40
【问题描述】:

我需要有静态或外部列表,A 类的每个对象都将使用它。列表的值只需要初始化一次,并且应该从构造函数参数中获取,例如:

def initialize(x, y):
    for i in range(0, x):
        static_to_return.append([])
        for j in range(0, y):
            static_to_return[i].append((i * x) + 1 + y)
    return static_to_return


class A:
    static_member = initialize(x, y)

    def __init__(self, x, y):
        self.x = x
        self.y = y

如何做到这一点?也许将static_member 移动到另一个模块会更好?或者是否可以在__init__函数中写入static_member

【问题讨论】:

  • 不清楚您期望发生什么。这应该是静态成员(实际上是:类属性)还是从为每个实例提供的构造函数参数初始化?当您创建A 的第二个实例时会发生什么?类工厂 (A = build_A_with(x, y)) 会是更好的方法吗? xy 来自哪里(以及何时)?
  • 会有很多A类对象,每个对象都有相同的xy值。我需要的是根据构造函数参数使用A 类的第一个实例化来初始化这个属性。
  • 如果他们都有相同的xy,为什么他们是__init__参数?这些用于为每个实例设置不同的东西。价值观究竟从何而来?您能否提供更多上下文,这似乎是XY (hah!) problem

标签: python static


【解决方案1】:

如果你想从类的first对象初始化静态成员,你可以在类定义中将其初始化为None,并在实例构造函数中测试其值:

class A:
    static_member = None

    def __init__(self, x, y):
        self.x = x
        self.y = y
        if A.static_member is None:  # still not initialized?
            A.static_member = initialize(x, y)  # ok, here it is

【讨论】:

    【解决方案2】:

    您似乎真的想在创建 class 时提供 xy,而不是在创建 instance 时提供。如果所有实例将共享相同的值,则无需将它们作为参数提供给__init__

    根据您的类的复杂程度,您可能需要为此使用a metaclass,但是对于这样一个简单的示例,您可以使用type

    x = 1
    y = 2
    A = type('A', (object,), dict(x=x, y=y, static_member=initialize(x, y)))  # *
    

    这将创建您想要的类,并且所有实例都共享您期望的状态:

    >>> a = A()
    >>> b = A()
    >>> a.static_member
    [[3, 3]]
    >>> b.static_member
    [[3, 3]]
    >>> a.static_member.append(['foo', 'bar'])
    >>> a.static_member
    [[3, 3], ['foo', 'bar']]
    >>> b.static_member
    [[3, 3], ['foo', 'bar']]
    >>> A.static_member
    [[3, 3], ['foo', 'bar']]
    

    * 请注意,我需要将行 static_to_return = [] 添加到 initialize 以使其运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多