我有以下代码,它带有两个列表a
和b
,并返回一个Diff.diff
属性,其中包含三个dict()
的列表。我希望能够使用属性dict
,Diff.diff.a
等来访问每个Diff.diff.b
。
当我创建Diff.diff
类的新实例时,Diff
是一个工作属性。但是,我收到错误
AttributeError:' list'对象没有属性' a'
在def __init__(...
开始定义子属性
class Diff(object):
def __init__(self, a, b):
self.a = dict(a)
self.b = dict(b)
Diff.diff = Diff.set_diff(self)
Diff.diff.a = Diff.diff[0]
Diff.diff.b = Diff.diff[1]
Diff.diff.c = Diff.diff[2]
def set_diff(self):
# do something with self.a and self.b here
return [{}, {}, {}] # returns a list with three items
我已尝试搜索此问题,老实说,我不知道要使用哪些搜索字词...希望这不是一个重复的问题。
修改
我的解决方案:
请注意,我的代码使用alpha
beta
gamaa
代替a
b
c
。
class DiffList(object):
def __init__(self, a):
assert isinstance(a, list) and len(a) == 3
self.alpha = DiffListItem(a[0])
self.beta = DiffListItem(a[1])
self.gamma = DiffListItem(a[2])
class Diff(object):
def __init__(self, a, b):
assert isinstance(a, list) and isinstance(b, list)
self.a = dict(a)
self.b = dict(b)
self.diff = DiffList(self.set_diff())
def set_diff(self):
# return the list with 3 dicts
return a
现在Diff.diff.alpha
等按预期返回列表中的dict。虽然此列表包含在DiffListItem
对象中,该对象具有打印有序列表的函数。
class DiffListItem(object):
def __init__(self, a):
assert isinstance(a, dict)
self.a = a
def ordered_list(self):
# Take a dict and sort by its value, returns a ordered list with entries
# as lists as [key, value]
keys = sorted(self.a, key=self.a.get, reverse=1)
res = [[key, self.a[key]] for key in keys]
return res
希望这对其他人有帮助。我对编程很陌生,还没有做过很多OOP。 Python正在向我介绍一下它的能力。
答案 0 :(得分:2)
set_diff
返回的值是Python list
对象。 list
个对象是一种数据结构,允许根据它们在数据结构中的位置来定位访问条目,就像数学类中的矩阵行一样(除了"条目"可以是任何类型的对象)。
您的代码要求名称为list
的{{1}}对象拥有属性Diff.diff
,该属性是对第0个条目的引用,依此类推。但这不是a
类支持的数据访问类型。
相反,您可以使用名为list
的特定数据类型,其中包含命名属性namedtuple
,a
和b
。在这种情况下,您的代码将如下所示:
c
答案 1 :(得分:1)
Diff.diff
是list
,您无法通过属性进行访问。相反,您可以使用这些属性创建新对象。使用DiffList
(或更好的名称;它不是list
)定义为:
class DiffList(object):
def __init__(self):
self.a = {}
self.b = {}
self.c = {}
您应该使用将其作为实例,而不是类,属性:
def __init__(self, a, b):
self.a = dict(a)
self.b = dict(b)
self.diff = DiffList() # no need for a separate method
self.diff.a # ...
然后您可以稍后访问它:
diff = Diff(a, b)
diff.diff.a # ...
答案 2 :(得分:-1)
我认为你想创造类似的东西:
class Diff(object):
a = None
b = None
c = None
def __init__(self, a, b):
self.a = dict(a)
self.b = dict(b)
#Do something here that modifies the diff.a, diff.b and diff.c
#attributes of the class like adding the dict to them
def set_diff(self):
# do something with self.a and self.b here
return [{}, {}, {}] # returns a list with three items
这样通过键入Diff.diff.a事件而不创建任何类Diff的对象),您将拥有属性的属性