在python中相同类的实例之间共享变量

时间:2020-04-06 17:39:06

标签: python class

我有一个我需要的课:

  1. 第一个实例必须接收一个参数。
  2. 以下所有实例的此参数均为可选。

如果未传递,那么我将使用先前对象init的参数。

为此,我需要在对象之间共享一个变量(所有对象都属于具有相同父对象的类)。

例如:

class MyClass:
    shared_variable = None

    def __init__(self, paremeter_optional=None):
        if paremeter_optional is None:      # Parameter optional not given
            if self.shared_variable is None:
                print("Error! First intance must have the parameter")
                sys.exit(-1)
            else:
                paremeter_optional = self.shared_variable       # Use last parameter

        self.shared_variable = paremeter_optional        # Save it for next object

objA = MyClass(3)
objB = MyClass()  

因为shared_variable在init中不一致/共享,所以在运行上述代码时出现错误:

Error! First intance must have the parameter

(在objB的第二次初始化之后)

当然,我可以使用全局变量,但我想尽可能避免使用它,并为此使用一些最佳实践。

2 个答案:

答案 0 :(得分:2)

更新:误解了最初的问题后,我仍然建议您明确提示,而不是让类跟踪信息更好地跟踪该类。

class MyClass:
    def __init__(self, parameter):
        ...

objA = MyClass(3)
objB = MyClass(4)
objC = MyClass(5)
objD = MyClass(5)  # Be explicit; don't "remember" what was used for objC

如果objCobjD足够“相关”,以致objD可以依靠objC的初始化,而您想变干,请使用类似的

objC, objD = [MyClass(5) for _ in range(2)]

原始答案:

我根本不会从实例中设置它;这是一个类属性,因此应仅在类级别设置。

class MyClass:
    shared_variable = None

    def __init__(self):
        if self.shared_variable is None:
            raise RuntimeError("shared_variable must be set before instantiating")

        ...


MyClass.shared_variable = 3
objA = MyClass()
objB = MyClass()  

答案 1 :(得分:1)

self.shared_variable分配一个值会使self.shared_variable成为实例属性,因此该值不会在实例之间共享。

您可以改为通过引用实例的类对象的属性来将值显式分配给class属性。

更改:

self.shared_variable = paremeter_optional

收件人:

self.__class__.shared_variable = paremeter_optional
相关问题