将属性设置为类的属性,后者从类方法返回

时间:2014-01-16 14:08:15

标签: python

我有以下代码,它带有两个列表ab,并返回一个Diff.diff属性,其中包含三个dict()的列表。我希望能够使用属性dictDiff.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正在向我介绍一下它的能力。

3 个答案:

答案 0 :(得分:2)

set_diff返回的值是Python list对象。 list个对象是一种数据结构,允许根据它们在数据结构中的位置来定位访问条目,就像数学类中的矩阵行一样(除了"条目"可以是任何类型的对象)。

您的代码要求名称为list的{​​{1}}对象拥有属性Diff.diff,该属性是对第0个条目的引用,依此类推。但这不是a类支持的数据访问类型。

相反,您可以使用名为list的特定数据类型,其中包含命名属性namedtupleab。在这种情况下,您的代码将如下所示:

c

答案 1 :(得分:1)

Diff.difflist,您无法通过属性进行访问。相反,您可以使用这些属性创建新对象。使用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的对象),您将拥有属性的属性