在Python中传递自定义类

时间:2012-09-12 00:02:44

标签: python python-2.7

我将一组MovieFile个对象从x.py传递给y.py并迭代它们,试图在y.py中使用每个对象的属性

x.py

mfSet = {}

def pop():
    ## populate mfSet with MovieFile objects
    m = MovieFile(title=t, year=y, dir=d, filename=f)
    mfSet.setdefault(str(m), []).append(m)

class MovieFile():
    def __init__(self, title, dir, filename, year=0):
        self.title = title
        self.year = year
        self.fulltitle = title if year == 0 else title + ' (' + year + ')'
        self.dir = dir
        self.filename = filename
    def __str__(self):
        return repr(self.title + ' (' + self.year + ') at ' + self.dir)

y.py

from x import MovieFile, mfSet, pop # not sure if I need to import MovieFile

pop()

for mf in mfSet:
    ft = mf.fulltitle # stacktrace says this attr doesn't exist for str object
    title = mf.title # printing shows that this is "<built-in method title of str object at 0x10d84a3f0>"

所以我的主要问题是:

为什么MovieFile对象编译为str对象,一旦我使用这些对象,如何使用fulltitle attr?

2 个答案:

答案 0 :(得分:1)

您尚未显示pop是什么(请包含该代码,这是重要的一点)。但是,我预计问题是mfSetdict并且您正在分配str个键 - 也许是mfSet[str(mf)] = mfdict的迭代产生键,而不是字典的值。

您可能希望使用set而不是dict。或者,将for mf in mfSet:更改为for mf in mfSet.itervalues():(并将变量名称mfSet更改为不会误导类型; PEP 8也建议使用变量名中的camelCase。)


所以,你按MovieFile.__str__()进行分组。那好吧。以下是我编写该代码的方法:

from collections import defaultdict

mf_collection = defaultdict(list)

def pop():
    ## populate the collection with MovieFile objects
    m = MovieFile(title=t, year=y, dir=d, filename=f)
    mf_collection[str(m)].append(m)

class MovieFile():

    def __init__(self, title, dir, filename, year=0):
        self.title = title
        self.year = year
        self.fulltitle = title if year == 0 else title + ' (' + year + ')'
        self.dir = dir
        self.filename = filename

    def __str__(self):
        return repr(self.title + ' (' + self.year + ') at ' + self.dir)

和y.py:

from x import mf_collection, pop

pop()

for mf_group in mf_collection.itervalues():  # this yields lists of MovieFiles
    for mf in mf_group:  # this yields the actual MovieFiles
        ft = mf.fulltitle
        title = mf.title

因为您正在使用列表作为值,所以您需要进行另一级迭代。

答案 1 :(得分:1)

{}创建一个字典,而不是一个集合(这是因为dictset文字都使用{}表示法,但字典文字首先出现。)

如果您想要一个空集,则需要使用set()。然后pop变为

mfSet = set()
def pop():
    mfSet.add(MovieFile(title=t, year=y, dir=d, filename=f))