2013-02-20 268 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