我有一个我需要的课:
如果未传递,那么我将使用先前对象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的第二次初始化之后)
当然,我可以使用全局变量,但我想尽可能避免使用它,并为此使用一些最佳实践。
答案 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
如果objC
和objD
足够“相关”,以致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