0

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

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

2 回答 2

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 链可以替换为更可扩展的方法,例如字典。

于 2013-06-12T20:23:57.317 回答
1

真正的面向对象的方式是创建一个基类(可能是抽象的,但不一定)和两个具体的实现——也就是策略模式。而不是直接实例化这些类,my_object = MyClass()而是创建“工厂”方法来实例化正确的实现并将其返回给被调用者 - 也就是工厂模式

像这样的东西:

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()
于 2013-06-12T20:28:32.843 回答