繁体   English   中英

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

[英]Write Python classes that have different behavior for Mac and 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()

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链可以用字典等更可扩展的方法代替。

Trueъ面向对象的方式将是创建一个基类(可能是抽象的,但不一定是)和两个具体的实现,即策略模式 比起使用my_object = MyClass()直接实例化这些类,您可以创建“ factory”方法来实例化正确的实现并将其返回给被调用者-又名Factory模式

像这样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM