我希望能够实例化一个对象,其方法的行为会因平台而异。
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 :(得分: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()