Python中的JavaBean等价物

26 投票
5 回答
17582 浏览
提问于 2025-04-17 16:33

我刚开始学习用Python进行面向对象编程,之前是用Java的。请问在Python中怎么写一个类似JavaBean的东西呢?基本上,我需要一个类,满足以下几点:

  1. 可以被序列化。
  2. 有获取和设置方法——也就是私有属性。
  3. 一个简单的构造函数。

有没有什么建议?我想要一些示例代码!

5 个回答

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有着非常不同的文化,需要一些时间去深入了解(并欣赏)这两者。

此外,写完一些代码后,比较一下常见的写法可能会很有帮助,这里列出了一些(我确实是通过这种方式学到了很多):

6

我觉得 数据类 和 Java 的 beans 有点像,使用它们其实是个不错的主意,因为这样可以减少一些重复的代码。

34

你不需要这样做,因为 Python 不是 Java。你可能只需要写一个简单一点的类,构造一个 命名元组,传一个字典,或者类似的东西。不过,针对这个问题,下面是一些要点:

  1. 在 Python 中,serializable 或者“实现接口”这些概念并不太适用(当然,在某些框架和高级用法中是有意义的,但在这里不需要)。像 pickle 这样的序列化模块可以直接使用,而不需要实现或继承什么特别的东西(你可以用其他方式来定制这个过程,但几乎不需要这样做)。
  2. 你不需要写 getter 和 setter。你只需使用公共属性。如果以后需要一个复杂的 getter/setter,你可以很方便地把它变成一个 property
  3. 除非你想创建属性并为它们设置默认值,否则不需要一个空的构造函数。但这可能不是个好主意(对于一个类似 bean 的类),因为不为这些属性赋值很可能是个错误,即使不是这样也很可疑。所以就让 Python 帮你捕捉这些错误吧(当访问一个不存在的属性时,它会抛出 AttributeError)。

撰写回答