免责声明:这可能是一个很主观的问题,没有“正确”的答案,但我很感激对最佳实践和程序设计的任何反馈。所以说:
我正在编写一个库,其中文本文件被读入Text
对象。现在,可以通过文件名列表或直接使用一个列表对象来初始化这些对象。我想知道最好/最python的方法是什么,因为如果我理解正确的话,python不直接支持方法重载。
我在Sentence
feature extraction module中发现的一个例子只是在初始化对象时将输入的类型作为参数传递。我假设一旦设置了这个参数,就只需要在内部处理不同的情况:
if input == 'filename':
# glob and read files
elif input == 'content':
# do something else
虽然这很容易实现,但看起来并不是一个非常优雅的解决方案。因此,我想知道是否有更好的方法来处理多种类型的输入来初始化一个我忽略的类。
最佳答案
一种方法是为实例化对象的不同方式创建具有不同名称的类方法:
class Text(object):
def __init__(self, data):
# handle data in whatever "basic" form you need
@classmethod
def fromFiles(cls, files):
# process list of filenames into the form that `__init__` needs
return cls(processed_data)
@classmethod
def fromSentences(cls, sentences):
# process list of Sentence objects into the form that `__init__` needs
return cls(processed_data)
这样,你只需创建一个“真实”或“规范”的初始化方法,接受任何你想要的“最低公分母”格式。专门的
fromXXX
方法可以对不同类型的输入进行预处理,以将它们转换成它们需要传递给标准范例的形式。这个想法是,你调用Text.fromFiles(...)
从文件名或Text
做出一个Text.fromSentences(...)
,以从句子对象中生成一个Text
。如果您只想接受几种可枚举类型的输入之一,也可以进行一些简单的类型检查。例如,一个类接受文件名(作为字符串)或文件对象并不少见。在这种情况下,你会:
def __init__(self, file):
if isinstance(file, basestring):
# If a string filename was passed in, open the file before proceeding
file = open(file)
# Now you can handle file as a file object
如果有许多不同类型的输入要处理,这将变得很难处理,但是如果它是像这样相对包含的东西(例如,可以用来获取该对象的对象或字符串“name”),它可以比我展示的第一个方法更简单。