www说
获取“替代构造函数”的一种更整洁的方法是使用类方法。例如:>>> 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)在于,调用者无法告诉您,例如,即使类型不是基本字符串,您也应将其视为字符串(而不是其他序列)。也许调用者希望为了不同的目的使用相同的类型,有时将其用作单个项目,有时将其作为一系列项目使用。明确的表达消除了所有疑问,并导致了更健壮和更清晰的代码。