将对象引用传递给Python中的多个类

时间:2018-07-06 19:19:01

标签: python oop design-patterns

我不确定您是否可以通过以上标题理解此问题。不用担心。这是对我的问题的解释。

我几乎没有类Field的对象,也很少有规则对象[来自不同类的每个规则都说RuleA,RuleB,RuleC,...]

我想将所有所有字段对象发送到每个规则对象。如果一个规则修改了字段对象属性,则应反映在所有其他规则中

class Field:
  a = 2
  b = 3
  # and few more attributes

field_count = 10 #let say i have 10 fields
fields = [Field() for i in range(field_count)]

class RuleA:
  def __init__(self, fields):
    self.fields = fields
  def process(self):
    self.fields[2].a = 61

class RuleB:
  def __init__(self.fields):
    self.fields = fields
  def process(self):
    print(self.fields[2].a)

..... other rules .....    

rule_a_obj = RuleA(fields)
rule_b_obj = RuleB(fields)

..... other rules initialization .....

rule_a_obj.process()
rule_b_obj.process() # should print 61

实现此目标的任何建议/想法

1 个答案:

答案 0 :(得分:2)

python中的名称是指存储值的位置,而不是值本身(数字等基本类型除外)。因此,当您进行分配时,您是在复制对相关对象的引用,而不是对象本身的完整深层克隆。

在下面很容易看到这一点:

my_dict = {'x': 1, 'y': 2}
my_dict_ref = my_dict
my_dict_ref['z'] = 3
print(my_dict) # {'y': 2, 'x': 1, 'z': 3}

因此,我们能够通过my_dict变量来修改my_dict_ref。在您的代码中,您已经实现了这一点,但是您两次调用了process()的{​​{1}}函数,因此从不调用print语句。 :)

RuleA

应为:

rule_a_obj.process() # should print 61