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

2024-09-29 22:37:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码,它接受两个列表ab,并返回一个Diff.diff属性,这是一个包含三个dict()的列表。我想通过使用属性的一个属性Diff.diff.aDiff.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

我试过搜索这个问题,老实说,我不知道用什么搜索词。。。希望这不是一个重复的问题。你知道吗


编辑:

我的解决方案:

注意我的代码使用alphabetagamaa而不是abc。你知道吗

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给了我一个很好的介绍。你知道吗


Tags: keyself列表属性objectinitdefwith
3条回答

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 # ...

set_diff返回的值是Pythonlist对象。list对象是一种数据结构,它允许根据条目在数据结构中的位置对其进行位置访问,与math类中的矩阵行非常相似(除了“条目”可以是任何类型的对象)。你知道吗

您的代码要求名为Diff.difflist对象拥有一个属性a,该属性是对第0个条目的引用,依此类推。但这不是list类支持的数据访问类型。你知道吗

相反,您可以使用名为namedtuple的特定数据类型,该数据类型具有命名属性abc。在这种情况下,您的代码如下所示:

class Diff(object):   

    def __init__(self, a, b):
        self.a = dict(a)
        self.b = dict(b)
        self.diff = self.set_diff(self)

    def set_diff(self):
        # do something with self.a and self.b here
        from collections import namedtuple
        diff_tuple = namedtuple('diff_tuple', 'a b c')
        return diff_tuple({}, {}, {}) # returns a tuple with three named items

我认为你想创造这样的东西:

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的任何对象的事件)您将拥有这个属性的属性

相关问题 更多 >

    热门问题