Python中的JavaBean等价物

26

我对使用 Python 作为 OOP 相对陌生,我来自 Java 的背景。您如何在 Python 中编写等效于 JavaBean 的类?基本上,我需要一个具有以下特点的类:

  1. 实现可序列化。
  2. 具有 getter 和 setter -> 私有属性
  3. 虚构构造函数

有什么建议吗? 我正在寻找示例代码!


谢谢大家解答我的问题。 - stealthspy
关于Python组件模型和快速应用程序开发的相关讨论:https://groups.google.com/g/comp.lang.python/c/efyjxFv6kVI - Stefan
5个回答

34

你做不到,因为Python不是Java。最有可能的情况是你应该编写一个较不琐碎的类,构造一个命名元组, 传递一个字典或类似的东西。但是为了回答这个问题:

  1. 在Python中,serializable和“实现接口”都没有意义(当然,在某些框架和高级用例中是有意义的,但不适用于此处)。序列化模块,例如pickle,可以在不实现或继承任何特殊内容的情况下工作(您可以以其他方式自定义该过程,但几乎永远不需要)。
  2. 你不需要编写getter和setter。您只需使用公共属性。如果以后需要非平凡的getter/setter,则可以将其透明地转换为property
  3. 除非您想创建属性并为其设置默认值,否则不需要虚拟构造函数。但这可能是个坏主意(对于类似bean的类),因为不为这些属性分配值很可能是一个错误,即使它不是一个错误也是可疑的。所以让Python为您捕获这些错误(当访问不存在的属性时,它会引发AttributeError)。

7
我正要提到那篇文章("Python is not Java")。 - Rodrigo Guedes
1
谢谢。我尝试了Python,我的代码只有一半的大小。谢谢!我发现了一门很棒的语言。我之前一直认为Java更好! - stealthspy
namedtuple 实例是不可变的,因此不适用于状态会发生改变的对象。 - ccpizza

6

我认为数据类类似于Java Bean,使用它们是一个好主意,因为它可以消除样板代码。


3
  1. 你可以通过pickle模块序列化大多数对象;
  2. Python中没有私有属性的概念(参见:
  3. 没有定义构造函数的类将使用默认值(根据方法解析顺序)。

构造函数'chain'的示例:

>>> 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有着截然不同的文化,需要一些时间去深入了解和欣赏。

另外,在编写代码后,将其与常见的惯用语进行比较可能会很有帮助,例如在这里列出的(我确实通过这种方式学到了很多):


1
实现可序列化。
选择您喜欢的格式,并编写一个函数来为您序列化它。JSON,Pickle,YAML,任何都可以。只需决定!
具有getter和setter -> 私有属性
我们不会这样做,这些是束缚语言的属性,我们在这种语言中都是成年人。
虚构构造函数
同样不是我们真正关心的事情,因为我们的构造函数比其他语言聪明一些。因此,您只需定义一个__init__即可完成所有初始化,如果必须,则编写工厂或子类化它。

1
我认为在大多数情况下,手动编写代码将对象转换为JSON/YAML等格式,或者从这些格式中转换对象既不必要也不可取。 - user395760
pickle不安全、速度慢或无法处理您的高级对象时,该怎么办? - Jakob Bowyer
这是其中一种情况,替代方案是可以的;-) 虽然我预计在许多这样的情况下,已经存在自动化解决方案,因此您仍然不需要手动编写代码。另外,在最后一种情况下,您始终可以使用 copyreg__reduce__ 来自定义 pickle 如何处理您的高级对象。 - user395760

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接