23

我对使用 Python 作为 OOP 还是很陌生。我来自 Java 背景。你将如何在 python 中编写一个等效的 javabean?基本上,我需要一个类:

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

有什么输入吗?我正在寻找示例代码!

4

5 回答 5

32

你没有,因为Python 不是 Java。很可能您应该只编写一个不那么琐碎的类,构造一个namedtuple,传递一个字典或类似的东西。但是要回答这个问题:

  1. 在 Python 中,“实现接口”都没serializable有意义(嗯,在某些框架和高级用例中确实如此,但在这里不是)。序列化模块,例如pickle,无需实现或继承任何特殊功能即可工作(您可以通过其他方式自定义流程,但几乎不需要)。
  2. 你不写 getter 和 setter。您只需使用公共属性。如果你以后需要一个重要的 getter/setter,你可以把它变成一个property透明的。
  3. 不需要虚拟构造函数,除非您想创建属性并为它们设置默认值。但这可能是一个坏主意(对于 bean-ish 类),因为不为这些属性分配值很可能是一个错误,即使不是这样也很可疑。因此,只需让 Python 为您捕获这些错误(AttributeError当访问不存在的属性时它会引发)。
于 2013-02-20T20:26:38.167 回答
4

好吧,我认为数据类将类似于 Java bean,并且使用它们实际上是一个好主意,因为它删除了样板。

于 2019-09-24T14:28:24.903 回答
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 有完全不同的文化,需要一些时间才能深入了解进入(并欣赏)两者。

此外,在编写了一些代码之后,将其与常见的习语进行比较可能会有所帮助,如下所示(我当然通过这种方式学到了很多东西):

于 2013-02-20T20:21:54.910 回答
1

正如 miku 所指出的:

  1. 对象可以通过picke模块序列化,但是没有接口可以实现,Python不是Java。

  2. python中没有私有属性,通常人们使用bar(下划线)来表示私有属性,但是可以从外部访问它们。getter 和 setter 对 CPU 和程序员来说都是浪费时间。

  3. 没有什么可以添加到 miku 答案中。

关于属性:关于如何在 python 中使用属性功能的真实示例?

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

于 2013-02-20T20:31:18.357 回答
1

实现可序列化。

选择你最喜欢的格式,并编写一个函数来为你序列化它。JSON,Pickle,YAML,任何工作。只要决定!

有 getter 和 setter -> 私有属性

我们在这里不这样做,那些是束缚语言的属性,我们都是这种语言的成年人。

虚拟构造函数

同样不是我们真正担心的事情,因为我们的构造函数比其他语言更聪明。所以你可以只定义一个__init__,它可以做你所有的初始化,如果你必须写一个工厂或子类它。

于 2013-02-20T20:26:13.367 回答