2014-10-16 66 views
0

我有2类(例如)如何摆脱make_xxx()方法?

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

+1

我不认为这是公平地调用设计模式“Java工厂”。这是一个与语言无关的概念,它在Java发明之前已经在Smalltalk-80中流行了15年。随意使用你喜欢的任何语言的工厂:-) – Kevin 2014-10-16 12:19:04

+1

工厂是一个工厂,但是你实现它 - 正如凯文提到的那样,工厂模式中没有任何特定于Java的工厂。一个普通的函数是Python中明显的,简单的默认实现,除非你的真实逻辑需要更复杂的构造,否则它是pythonic的一个。 – 2014-10-16 13:00:37

+0

感谢布鲁诺以下的食谱。同意我的简化方法实际上是更多Pythonic。时间丢失一点行李,methinks – jalanb 2014-10-16 13:37:42

回答

1

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

  1. 它仍然是一个工厂,
  2. 没准就会是没有很好的理由,这本身就足以让更复杂它unpythonic。

说明用途而言,这是一个使用abc找到相应的具体子类,而在基类harcoding子类问答& d例如:

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

在这种情况下,“path”听起来不错。 由于makepath方法返回或目录或文件路径,只是路径看起来更通用和简短!

def path(string): 
    if os.path.isfile(string): 
     return FilePath(string) 
    return DirectoryPath(string) 
+1

我不认为OP正在为他的功能寻找一个新的名字。我认为他想用其他的东西完全替代这个功能。工厂就是工厂,即使它的名字没有“make”。 – Kevin 2014-10-16 12:20:08