首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中将对象引用传递给多个类

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

Stack Overflow用户
提问于 2018-07-07 03:19:01
回答 1查看 564关注 0票数 0

我不确定你能不能用上面的标题理解这个问题。别担心。这是对我的问题的解释。

我有几个Field类的对象,也有几个规则对象,每个规则来自不同的类,比如RuleA,RuleB,RuleC,...

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

代码语言:javascript
复制
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

为实现这一目标有什么建议/想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-07 03:27:30

python中的名称是指存储值的位置,而不是值本身(除了数字之类的基本类型)。因此,当您进行赋值时,您复制的是对相关对象的引用,而不是对象本身的完全深度克隆。

这一点很容易从以下几个方面看出:

代码语言:javascript
复制
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_ref变量修改my_dict。在您的代码中,您已经做到了这一点,但是您调用了两次RuleAprocess()函数,所以您的打印语句永远不会被调用。:)

代码语言:javascript
复制
rule_a_obj.process() # should print 61

应为:

代码语言:javascript
复制
rule_b_obj.process() # should print 61
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51216523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档