2014-10-16 99 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