Python 在面向对象编程中,创建列表和过滤各种结果的好方法是什么?
我有一个方法可以创建一个目录的文件列表,但我有多个其他方法可以执行相同的操作,并在循环过程中进行一些额外的过滤 这看起来是一个非常糟糕的解决方案,我非常感兴趣的是如何做得更优雅 下面是我正在做的一个简单示例:Python 在面向对象编程中,创建列表和过滤各种结果的好方法是什么?,python,oop,Python,Oop,我有一个方法可以创建一个目录的文件列表,但我有多个其他方法可以执行相同的操作,并在循环过程中进行一些额外的过滤 这看起来是一个非常糟糕的解决方案,我非常感兴趣的是如何做得更优雅 下面是我正在做的一个简单示例: class foo(object): def read_files_in_dir(...) .... def filter_x(...): for file in read_files_in_dir(...): i
class foo(object):
def read_files_in_dir(...)
....
def filter_x(...):
for file in read_files_in_dir(...):
if file.startswith("x"):
yield file
def filter_y(....):
for file in read_files_in_dir(...):
if file.startswith("y"):
yield file
...
我不想合并过滤器
-函数的所有结果,每个结果都有不同的含义,因为我正在读取需要不同过滤方式的不同目录
有没有什么方法可以让循环有一个中心函数,并且可以在不进行参数化的情况下使用不同的过滤选项
//编辑
我现在用以下方法来做:
class Something(object):
@staticmethod
def read_files_in_dir(self, directory, filter_func=lambda _: return True):
for file in directory:
if filter_func(file):
yield file
class Filters(object):
@staticmethod
def filter1(file):
return True if *some_condition* else False
然后我会做这样的事情:
filtered = Something.read_files_in_dir(*directory*, Something.Filters.filter1)
有什么改进建议吗?您的示例可能过于简化,但以下内容应该与您的示例基本相同:
def read_files_in_dir(...)
...
def filter(self, param, ...):
return (file for file in read_files_in_dir(...) if file.startswith(param))
如果您的筛选器比单个测试中适用的筛选器更复杂,则可以创建其他方法/函数,您可以将文件实例传递给这些方法/函数,并根据需要返回True/False。您的示例可能过于简化,但以下内容应该与您的示例基本相同:
def read_files_in_dir(...)
...
def filter(self, param, ...):
return (file for file in read_files_in_dir(...) if file.startswith(param))
如果您的筛选器比单个测试中的筛选器更复杂,则可以创建附加的方法/函数,您可以将文件实例传递给这些方法/函数,并根据需要返回True/False。多洛根答案很好。
其思想是将过滤器值作为参数传递给过滤器函数。
然而,为了使过滤器更健壮,我会使用过滤器字典。
在字典中,可以指定搜索类型和值:
例如:
过滤器列表={'start':'y',…)
如果您想变得更复杂,可以将filter函数放在一个列表中,并将字符串作为参数传递。
例如:
filename = 'try_me.py'
filterString = 't'
filterListA = [str.startswith]
filterListB = [str.endswith, str.startswith]
filterListC = [str.find]
def my filter(filterList, filterString):
for filterFunc in filterList:
print filterFunc(filename,filterString)
多洛根的回答很好。
其思想是将过滤器值作为参数传递给过滤器函数。
然而,为了使过滤器更健壮,我会使用过滤器字典。
在字典中,可以指定搜索类型和值:
例如:
过滤器列表={'start':'y',…)
如果您想变得更复杂,可以将filter函数放在一个列表中,并将字符串作为参数传递。
例如:
filename = 'try_me.py'
filterString = 't'
filterListA = [str.startswith]
filterListB = [str.endswith, str.startswith]
filterListC = [str.find]
def my filter(filterList, filterString):
for filterFunc in filterList:
print filterFunc(filename,filterString)
在构建过滤系统时,通常的想法是创建一些宇宙数据,然后通过一组过滤函数运行该宇宙中的每个项目,每个过滤函数接受一个项目并返回一个布尔结果。只有当所有过滤器都返回true时,才会保留宇宙中的项目 下面是一个简单的函数式示例。如果较大的程序需要,可以很容易地转换为面向对象的方法:
def main():
universe = read_files_in_dir()
filters = [is_odd, larger_than_ten]
for item in universe:
if all(f(item) for f in filters):
print item
def read_files_in_dir():
return list(range(20))
def is_odd(item):
return bool(item % 2)
def larger_than_ten(item):
return item > 10
main()
在构建过滤系统时,通常的想法是创建一些宇宙数据,然后通过一组过滤函数运行该宇宙中的每个项目,每个过滤函数接受一个项目并返回一个布尔结果。只有当所有过滤器都返回true时,才会保留宇宙中的项目 下面是一个简单的函数式示例。如果较大的程序需要,可以很容易地转换为面向对象的方法:
def main():
universe = read_files_in_dir()
filters = [is_odd, larger_than_ten]
for item in universe:
if all(f(item) for f in filters):
print item
def read_files_in_dir():
return list(range(20))
def is_odd(item):
return bool(item % 2)
def larger_than_ten(item):
return item > 10
main()
只需重构并添加一个参数。这类事情不需要任何奇特的OOP设计模式。嗯,但我有很多过滤器,所以将它们全部放在一个方法中会导致if语句混乱,我认为:-/使过滤器成为一个单独的类,并将其一个或多个实例作为参数传递给其他使用它们的过滤器目录中的谓词。@jervis,这样您就可以有一个复合筛选器。
myFilter=lambda x:all(谓词(x)表示[f1,f2,f3,f4]中的谓词)
只需重构并添加一个参数。这类事情不需要任何奇特的OOP设计模式。嗯,但我有很多过滤器,所以将它们全部放在一个方法中会导致if语句混乱,我认为:-/使过滤器成为一个单独的类,并将其一个或多个实例作为参数传递给其他使用它们的过滤器目录中的文件。@jervis,这样您就可以有一个复合筛选器。myFilter=lambda x:all(谓词(x)表示[f1,f2,f3,f4]中的谓词)