编写对Mac和Windows具有不同行为的Python类

时间:2013-06-12 20:18:31

标签: python windows macos

我希望能够实例化一个对象,其方法的行为会因平台而异。

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()

2 个答案:

答案 0 :(得分: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链可以用更易扩展的方法替换,例如字典。

答案 1 :(得分: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()