我有2个班级(例如)
class FilePath(Path):
pass
class DirectoryPath(Path):
pass
我选择通过makepath()方法simplified实例化哪一个:
def makepath(string):
if os.path.isfile(string):
return FilePath(string)
return DirectoryPath(string)
多年来我一直不喜欢make_xxx()方法。它让我想起了一个Java工厂,所以我想知道是否有更多的Pythonic成语?
答案 0 :(得分:1)
还有其他解决方案(例如覆盖Path.__new__
)但
为了便于说明,这里是一个Q& D示例,使用abc
查找适当的具体子类,而不在基类中编码子类:
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)
答案 1 :(得分:-1)
在这种情况下只是" path
"听起来不错。
由于makepath方法返回或目录或文件路径,只是路径似乎更一般和短!
def path(string):
if os.path.isfile(string):
return FilePath(string)
return DirectoryPath(string)