假设我有一个类,该类具有一个名为data的成员,该成员是一个列表。
我希望能够使用例如文件名(包含用于初始化列表的数据)或实际列表进行初始化的类。
您执行此操作的技巧是什么?
您只是通过查看来检查类型__class__
吗?
我可能会缺少一些技巧吗?
我习惯C ++,按参数类型重载很容易。
获取“替代构造函数”的一种更整洁的方法是使用类方法。例如:
>>> class MyData:
... def __init__(self, data):
... "Initialize MyData from a sequence"
... self.data = data
...
... @classmethod
... def fromfilename(cls, filename):
... "Initialize MyData from a file"
... data = open(filename).readlines()
... return cls(data)
...
... @classmethod
... def fromdict(cls, datadict):
... "Initialize MyData from a dict's items"
... return cls(datadict.items())
...
>>> MyData([1, 2, 3]).data
[1, 2, 3]
>>> MyData.fromfilename("/tmp/foobar").data
['foo\n', 'bar\n', 'baz\n']
>>> MyData.fromdict({"spam": "ham"}).data
[('spam', 'ham')]
它之所以整洁,是因为毫无疑问期望使用哪种类型,并且您不必强迫猜测调用者打算使用它给您的数据类型做什么。问题isinstance(x, basestring)
在于,例如,即使类型不是基本字符串,调用者也无法告诉您,即使类型不是基本字符串,您也应将其视为字符串(而不是其他序列)。也许调用者希望为了不同的目的使用相同的类型,有时将其作为单个项目,有时作为一系列项目使用。明确的表达消除了所有疑问,并导致了更健壮和更清晰的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句