使自定义类的行为类似于set

时间:2014-06-09 03:48:54

标签: python class set

我尝试在文件夹中创建一个包含文件名的类。但我希望它表现得像套装一样。现在我有了这个:

class Files():

    def __init__(self, in_dir):
        self.in_dir = in_dir
        self.files = set(map(os.path.basename, glob.glob(self.in_dir + "/*.txt")))

    def __add__(self, other):
        return self.files + other.files    

    def __or__(self, other):
        return self.files | other.files

    def __and__(self, other):
        return self.files & other.files

    def __xor__(self, other):
        return self.files ^ other.files

这项工作和我可以这样做:

f1 = Files(inDir1)
f2 = Files(inDir2)

diff_files = f1 ^ f2 % this give files that are in f1 or f2 folder but not in both  folders

这没关系,但问题是diff_files不是Files的实例。如何更改我的类,表现得像python 3.x中的set?

2 个答案:

答案 0 :(得分:3)

首先,使in_dir参数可选:

def __init__(self, in_dir=None):
    if in_dir:
        self.in_dir = in_dir
        self.files = set(map(os.path.basename, glob.glob(self.in_dir + "/*.txt")))

然后,更改__xor__()

def __xor__(self, other):
    instance = Files()
    instance.files = self.files ^ other.files
    return instance

另外,我没有看到将in_dir保留为实例变量的原因。您可以简化__init__()

def __init__(self, in_dir=None):
    if in_dir:
        self.files = set(map(os.path.basename, glob.glob(in_dir + "/*.txt")))

或者,您可以通过传递Files集来允许初始化files

def __init__(self, in_dir=None, files=None):
    if in_dir:
        self.files = set(map(os.path.basename, glob.glob(in_dir + "/*.txt")))
    if files:
        self.files = files

然后,__xor__()方法会更简单:

def __xor__(self, other):
    return Files(files=self.files ^ other.files)

答案 1 :(得分:1)

我不确定我理解你的意思"表现得像套装"但我确实理解你想要返回Files的实例,而不仅仅是" diff",所以为此:

变化:

def __xor__(self, other):
        return self.files ^ other.files

为:

def __xor__(self, other):
        result = Files()
        result.in_dir = self.in_dir
        result.files = self.files ^ other.files
        return result