繁体   English   中英

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

[英]Share variable between instances of the same class in python

我有一个我需要的 class:

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

如果不通过那我就使用前面object 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 在初始化之间不一致/共享,所以在运行上述代码时出现错误:

Error! First intance must have the parameter

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

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

更新:误解了最初的问题,我仍然建议明确,而不是在 class之外更好地跟踪 class 轨道信息。

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的初始化,并且您想要 DRY,请使用类似

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

原答案:

我根本不会把它做成你从实例中设置的东西。 这是一个 class 属性,因此只能在 class 级别设置。

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()  

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

您可以改为通过引用实例的 class object 的属性,将值显式分配给 class 属性。

改变:

self.shared_variable = paremeter_optional

至:

self.__class__.shared_variable = paremeter_optional

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM