我有一個用於數據分析的類。通常我需要創建一個類的幾個實例,然後在每個實例上運行一系列的方法。我需要運行的方法因實例而異。Runner方法作爲方法鏈接的替代方法嗎?
今天我的代碼(使用類)通常看起來是這樣的:
object_alpha = MyClass()
object_alpha.method1()
object_alpha.method2()
object_alpha.method3(arg1)
object_alpha.method4()
object_bravo = MyClass()
object_bravo.method1()
object_bravo.method3(arg1)
object_bravo.method4()
object_bravo.method5()
我知道上面的例子不是方法鏈的一個例子。方法鏈現在不可能,因爲方法不返回類的一個對象。
這種格式有點冗長乏味,尤其是對於很長的描述性變量名稱。我主要的抱怨是我不覺得它很可讀。
我想過改變我的類從每個方法調用返回一個新的對象,以便我可以做方法鏈接。但是這些方法的副作用不會改變這個類 - 它們通過一個API來改變數據庫,所以返回一個新的對象感覺很奇怪。
我的想法是創建一個將方法名稱列表作爲字符串的runner類。所以我可以做這樣的事情。
object_alpha = MyClass().runner([
'method1',
'method2',
'method3(arg1)',
'method4'
])
object_bravo = MyClass().runner([
'method1',
'method3(arg1)',
'method4',
'method5'
])
這是一個壞主意;有更好的方法嗎?
1-在您的問題中明確指出您明白您的代碼示例不代表方法鏈接。 2 - ''method3(arg1)''不像其他人,否則你可以在名稱中使用'methodname:getattr(obj,methodname)()'3-是的,這是一個壞主意。爲避免指定對象名稱,您將引入更多級別的間接引用。你想買什麼?提供實際的代碼,否則問題太廣泛(指定一個更好的選擇)。 4-看看[sqlalchemy'如何使用方法鏈接](http://docs.sqlalchemy.org/en/latest/glossary.html#term-method-chaining) – jfs
我沒有看到你從你的亞軍獲得的東西例。編寫它仍然很乏味,但是會增加程序的複雜性。請參閱[內部平臺效果](https://en.wikipedia.org/wiki/Inner-platform_effect)。從這個角度來看,不,它在設計上看起來不是一個好主意。 –
感謝您的評論,我嘗試按照建議清理問題。至於我想獲得什麼,關於可讀性的更多時間和更多。 – Chris