2011-12-02 45 views
3

我在回答問題Python progression path - From apprentice to guru時看到了這條指令。爲什麼聲稱一個python類可以更好地實現爲一個字典加上一些函數?

9.每當他們向你展示一個Python類時,惹惱你的隔間。聲稱它可以「更好地」作爲字典加上一些功能來實現。擁抱函數式編程。

但我不明白這一點。這對函數式編程有什麼作用?

+7

其中大部分建議都非常貼切。原則上,每個類都可以作爲一組函數來實現,總是傳遞一個字典作爲第一個參數。 (當然,你會失去動態多態性。) –

+1

@SvenMarnach:你可以擁有你的多態,只需將函數放在字典中即可。然後,只需調用'aDict ['aMethodName'](aDict,...)'並且砰的一聲,就會產生多態性。 –

+2

你需要先閱讀真實世界的哈斯克爾,然後才能進入9級;) – hugomg

回答

3

這是在「Python進程路徑」中的原因是它反映了一種認識,即Python類只是函數和字典的語法糖,並且通過直接使用函數和字典,需要更少的語言元素,從而使自己的節目更加「純粹」。

當然這是完全錯誤的,這就是爲什麼它很有趣。或者,也許我還沒有達到啓蒙呢?

3

這意味着:

class A: 
    def __init__(this): 
     this.count = 0 
    def bump(this): 
     this.count += 1 

a = A() 
a.bump() 

可以通過東西線沿線的更換:

def constructA(): 
    return {'count':0} 

def bumpA(anA): 
    anA['count'] += 1 

a = constructA() 
bumpA(a) 

或者,更實用的風格,通過返回一個副本避免副作用:

def bumpedA(anA): 
    newA = {'count': (anA['count'] + 1)} 
    return newA 

a = constructA() 
a = bumpedA(a) 

這是基本模式 - 您可以通過將方法放入字典本身來獲得多態性(javascr ipt-style),並且通常使用字典和函數來重建整個Python對象系統。

+0

這有什麼好處嗎? – RustyFluff

+0

@RustyFluff:難題,因爲這是一個品味問題(至少在某種程度上)。在Python中,一般來說 - 不,除非你有一個非常具體的理由這樣做。也許是一個JavaScript程序的快速和骯髒的翻譯。 Python之外 - 也許檢查Clojure的多態性,看看你喜歡它。優點是不變性,儘管這又是一個味道問題。 –

相關問題