[英]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.