将字典分配给类对象
Posted
技术标签:
【中文标题】将字典分配给类对象【英文标题】:Assigning dictionary to a class object 【发布时间】:2020-12-24 19:41:18 【问题描述】:下面两个类定义有什么区别,
class my_dict1(dict):
def __init__(self, data):
self = data.copy()
self.N = sum(self.values)
上面的代码生成AttributeError: 'dict' object has no attribute 'N'
,而下面的代码编译
class my_dict2(dict):
def __init__(self, data):
for k, v in data.items():
self[k] = v
self.N = sum(self.values)
例如,
d = 'a': 3, 'b': 5
a = my_dict1(d) # results in attribute error
b = my_dict2(d) # works fine
【问题讨论】:
注意,self = whatever
可能没有按照您的想法行事。 self
只是 __init__
函数中的一个局部变量,它不是魔法,也不会改变你的实例。因此,您只需将传入的dict
分配给局部变量self
。
【参考方案1】:
通过将self
本身分配给任何您将self
分配给与您最初处理的实例完全不同的实例,使其不再是“自我”。此实例将属于更广泛的类型dict
(因为data
是dict
),而不是更窄的类型my_dict1
。您需要在第一个示例中执行 self["N"]
才能正确解释它,但请注意,即使这样,类似:
abc = mydict_1()
abc
仍然没有键“N”,因为__init__
中的一个完全不同的实例被赋予了键“N”的值。这向您表明,不存在将self
本身分配给其他东西的合理方案。
关于my_dict2
,如果您想使用特定的dict
作为您的域的表示,则更喜欢组合而不是继承。这意味着将data
作为实例字段。查看相关C#问题Why not inherit from List?,核心答案还是一样的。这取决于您是要扩展 dict
机制还是拥有基于它的业务对象。
【讨论】:
考虑澄清局部变量self
和最初由self
引用的对象之间的区别。这个答案可能会误导某人相信my_dict1.__init__
以某种方式将原始my_dict1
实例与dict
交换,事实并非如此。
澄清一下(在__init__
类内),self = data
是分配给局部变量,而self[k] = data[k]
是分配给self
对象?以上是关于将字典分配给类对象的主要内容,如果未能解决你的问题,请参考以下文章
Swift/Combine - 将过滤后的对象分配给类的属性
将指针分配给指针(并将指针传递给类)时使用删除的 C++ 混淆