擅长:python、mysql、java
<p>获取“备用构造函数”的一种更简洁的方法是使用类方法。例如:</p>
<pre><code>>>> 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')]
</code></pre>
<p>它更简洁的原因是,对于预期的数据类型没有疑问,并且您不会被迫猜测调用者打算让您如何处理它提供给您的数据类型。<code>isinstance(x, basestring)</code>的问题在于,调用者无法告诉您,例如,即使类型不是基串,您也应该将其视为字符串(而不是另一个序列)。而且调用者可能希望将同一类型用于不同的目的,有时作为单个项,有时作为项序列。明确化消除了所有疑问,并导致更健壮、更清晰的代码</p>