我有下面的代码,它接受两个列表a
和b
,并返回一个Diff.diff
属性,这是一个包含三个dict()
的列表。我想通过使用属性的一个属性Diff.diff.a
、Diff.diff.b
等来访问每个dict
现在,当我创建Diff
类的新实例时,Diff.diff
是一个有效的属性。然而,我得到的错误是
AttributeError: 'list' object has no attribute '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
希望这对其他人有帮助。我对编程还比较陌生,还没有做太多面向对象的工作。Python给了我一个很好的介绍。你知道吗
Diff.diff
是list
,您不能通过属性访问它。相反,您可以使用这些属性创建一个新对象。用DiffList
(或者更好的名字;它不是list
)定义为:您可能应该使用此属性作为实例,而不是类属性:
然后您可以稍后访问它:
set_diff
返回的值是Pythonlist
对象。list
对象是一种数据结构,它允许根据条目在数据结构中的位置对其进行位置访问,与math类中的矩阵行非常相似(除了“条目”可以是任何类型的对象)。你知道吗您的代码要求名为
Diff.diff
的list
对象拥有一个属性a
,该属性是对第0个条目的引用,依此类推。但这不是list
类支持的数据访问类型。你知道吗相反,您可以使用名为
namedtuple
的特定数据类型,该数据类型具有命名属性a
、b
和c
。在这种情况下,您的代码如下所示:我认为你想创造这样的东西:
通过键入差异。一个没有创建类Diff的任何对象的事件)您将拥有这个属性的属性
相关问题 更多 >
编程相关推荐