我尝试在文件夹中创建一个包含文件名的类。但我希望它表现得像套装一样。现在我有了这个:
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?
答案 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