2013-02-20 125 views
12

我是使用Python作爲OOP的新手段。我來自Java背景。你將如何在python中編寫一個javabean等價物?基本上,我需要一個類:在Python中相當於JavaBean

  1. 實現可序列化。
  2. 有getter和setter - >私有財產
  3. 虛擬構造

任何投入?我正在尋找一個示例代碼!

+0

謝謝大家。在這裏解決我的查詢。 – stealthspy 2013-02-24 01:39:11

回答

21

你不這樣做,因爲Python is not Java。最有可能的是,你應該只寫一個不太平凡的課,構建一個namedtuple,通過一本字典或類似的東西。但是,爲了回答這個問題:

  1. 無論serializable也不是「實現接口」使在Python意義(當然,在一些框架和它先進的用例,但不是在這裏)。序列化模塊(如pickle)的工作不需要實現或繼承任何特殊功能(您可以用其他方式自定義過程,但幾乎不需要)。
  2. You don't write getters and setters。你只是使用公共屬性。如果你以後需要一個非平凡的吸氣/吸氣裝置,你可以透明地把它變成property
  3. 除非您想爲它們創建屬性並設置默認值,否則不需要虛擬構造函數。但是這可能是一個壞主意(對於豆類,),因爲沒有爲這些屬性賦值很可能是錯誤,即使不是這樣也是可疑的。所以讓Python爲你捕捉這些錯誤(當訪問一個不存在的屬性時,它會提升AttributeError)。
+5

+1:我剛纔提到那篇文章(「Python不是Java」)。 – 2013-02-20 20:28:12

+0

Lol,剛剛發佈的文章鏈接... – flaviotruzzi 2013-02-20 20:32:19

+1

謝謝。我試過Python,我的代碼只有一半大小。謝謝!我剛剛找到了一種美妙的語言。我處在一個泡沫中,Java變得更好了! – stealthspy 2013-02-24 01:37:39

3
  1. 您可以通過pickle模塊序列化大多數對象;
  2. 有沒有這樣的事情私有屬性在Python(參見:
  3. 未定義構造函數的類將使用默認值(根據方法解析順序)。

示例構造 '鏈':

>>> class A(object): 
...  def __init__(self): 
...   print("A") 
...  
... 
>>> class B(A): pass # has no explicit contructor 
... 
>>> b = B() 
A 
>>> 

而且 - 爲@delnan寫的 - 你可能需要閱讀:http://dirtsimple.org/2004/12/python-is-not-java.html - Java和Python具有完全不同的文化,它需要一些時間來潛入(並欣賞)兩者。

此外,編寫一些代碼之後,它可能有助於其與常見的成語,如這裏列出的(當然,我學到了很多這樣):

+0

非常感謝回覆。 – stealthspy 2013-02-24 01:37:57

1

實現可序列化。

選擇你喜歡的格式,並編寫一個函數,將它序列化爲你。 JSON,Pickle,YAML,任何工作。只要決定!

有getter和setter - >私有財產

我們不這樣做,在這裏,那些是束縛語言的屬性,我們在所有使用這種語言的成年人。

虛擬構造

同樣不是我們真正擔心的是我們的構造比其他語言更聰明一點。所以你可以定義一個__init__,它可以完成所有的初始化,如果你必須寫一個工廠或子類。

+1

我會說手動編寫代碼來將對象轉換爲JSON/YAML /等。在大多數情況下既不必要也不可取。 – delnan 2013-02-20 20:27:26

+0

當'pickle'不應該使用,因爲它的不安全或其緩慢,或它不能處理你的幻想物體? – 2013-02-20 20:29:35

+0

這是其中一種替代品很好的情況;-)雖然我預計在許多此類情況下,現有的解決方案會自動執行此操作,因此您仍然不需要手動編寫代碼。另外,在最後一種情況下,您總是可以使用'copyreg'或'__reduce__'來定製pickle如何處理您喜歡的對象。 – delnan 2013-02-20 20:36:24

0

正如指出由三苦:

  1. 目的可以通過picke模塊被序列化,但沒有被實現的接口,Python是不是Java。

  2. 在Python中沒有私有屬性,通常人們使用bar(下劃線)表示私有屬性,但它們可以從外部訪問。吸氣劑和吸附劑會浪費CPU和程序員的時間。

  3. 沒有添加到miku答案。

有關屬性:Real world example about how to use property feature in python?

好文:http://dirtsimple.org/2004/12/python-is-not-java.html