擅长:python、mysql、java
<p>还有其他解决方案(比如重写<code>Path.__new__</code>),但是</p>
<ol>
<li>它仍然是一个工厂</li>
<li>很有可能它会因为没有好的理由而变得更加复杂,这本身就足以使它变得不和谐。你知道吗</li>
</ol>
<p>为了便于说明,下面是一个Q&D示例,使用<code>abc</code>查找适当的具体子类,而不在基类中对子类进行harcoding:</p>
<pre><code>import os
import abc
class Path(object):
__metaclass__ = abc.ABCMeta
def __new__(cls, path):
imp = cls._get_subclass_for(path)
instance = super(Path, cls).__new__(imp)
return instance
def __init__(self, path):
self.path = path
@classmethod
def _get_subclass_for(cls, path):
#import pdb; pdb.set_trace()
for subclass in cls.__subclasses__():
if subclass.match(path):
return subclass
raise LookupError("No matching subclass for path '%s'" % path)
@staticmethod
@abc.abstractmethod
def match(path):
return False
@Path.register
class FilePath(Path):
@staticmethod
def match(path):
return os.path.isfile(path)
@Path.register
class DirectoryPath(Path):
@staticmethod
def match(path):
return os.path.isdir(path)
</code></pre>