如何摆脱make_xxx()方法?

时间:2014-10-16 12:06:27

标签: python

我有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成语?

2 个答案:

答案 0 :(得分:1)

还有其他解决方案(例如覆盖Path.__new__)但

  1. 它还是一家工厂,
  2. 没有充分理由可能会更加复杂,这本身就足以让它成为无声的。
  3. 为了便于说明,这里是一个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)