我有兩個類與方法foo
:玩對象創建
Foo = type('Foo', (object,), {'foo': lambda s: 'Foo method'})
Bar = type('Bar', (object,), {'foo': lambda s: 'Bar method'})
我有一些其它類,我需要根據參數子類上述類別之一。
我的解決方案:
class Subject(object):
def __new__(cls, key):
base = (Foo if key else Bar)
name = cls.__name__ + base.__name__
dict_ = dict(cls.__dict__.items() + base.__dict__.items())
bases = (base, cls)
t = type(name, bases, dict_)
return base.__new__(t)
def bar(self):
return 'Subject method'
測試:
print(Subject(True).foo(), Subject(True).bar())
print(Subject(False).foo(), Subject(False).bar())
輸出:
('Foo method', 'Subject method')
('Bar method', 'Subject method')
足夠的這個解決方案安全嗎?或者我需要更多的東西來了解?是否有更多的pythonic方式來做這種不規則的東西?
讓兩個班,'SubjectFoo'和'SubjectBar',繼承分別從'Foo'和'Bar',然後編寫一個函數'Subject'來檢查一個參數並返回一個正確類的實例。以意想不到的方式破壞的可能性要小得多。 –
@ChrisLutz你可以在我的解決方案中看到什麼意想不到的方式? – scraplesh