2013-06-12 116 views
0

不同的行爲寫Python類我希望能夠實例化一個對象,它的方法將不同的表現取決於平臺。有適用於Mac和Windows

import sys 

class MyClass(object): 

    @property 
    def os_is_darwin(self): 
     return sys.platform == 'darwin' 

    def get_home_directory(self): 
     if self.os_is_darwin: 
      return '/Users/travis/' 
     else: 
      return 'C:\\Users\\travis\\' 

是否有一個更清潔的方式使用一個抽象基類和劃分Mac和Windows實現到子類來做到這一點?重要的是抽象掉了平臺的調用者爲上述類做:

my_object = MyClass() 
print my_object.get_home_directory() 
+0

你有什麼理由不對於不同的平臺有不同的類別? – delnan

+0

你知道'os.path.expanduser'? http://docs.python.org/2/library/os.path.html?highlight=os.path#os.path.expanduser –

+0

@NiclasNilsson的get_home_directory方法僅僅是一個例子。我將根據平臺添加更多需要不同功能的方法。 – travis1097

回答

3

是否有必要MyClass真的是一個類,或者它可能只是看起來像在一類,你可以調用它來創建一個東西?讓我們把它MyObject所以它聽起來並不完全有悖常理,而且你最終是這樣的:

def MyObject(): 
    import sys 
    if sys.platform == 'darwin': 
    return MyDarwinObject() 
    else: 
    return MyDefaultObject() 

my_object = MyObject() 
print my_object.get_home_directory() 

這種「江湖醫生如魚得水」,在你最有可能使用的方式,並允許您如果您願意,可以將實際不同的課程完全分開。 (如果你想分享的功能,你當然可以使用繼承。)

與自然的if-else鏈可與更具擴展性的方法來代替,如字典。

+0

這就是它!我會在五分鐘內接受你的答案。 – travis1097

1

Trueъ面向對象的方法是創建一個基類(很可能是抽象的,但不一定)和兩個具體的實現 - 又名Strategy pattern。比,而不是直接實例化這些類與my_object = MyClass()創建「工廠」的方法來實例化的正確實施,並將其返回給被叫方 - 又名Factory pattern

類似的東西:

class BaseHandler(object): 
    pass 

class OSXHandler(BaseHandler): 
    pass 

class WindowsHandler(BaseHandler): 
    pass 

def create_handler(): 
    import sys 
    return OSXHandler() if sys.platform == 'darwin' else WindowsHandler() 

handler = create_handler() 
handler.get_home_directory() 
相關問題