Python 中的 JavaBean 等价物

Posted

技术标签:

【中文标题】Python 中的 JavaBean 等价物【英文标题】:JavaBean equivalent in Python 【发布时间】:2013-02-06 00:00:18 【问题描述】:

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

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

任何输入?我正在寻找示例代码!

【问题讨论】:

谢谢大家。在这里解决我的问题。 python组件模型及快速应用开发相关讨论:groups.google.com/g/comp.lang.python/c/efyjxFv6kVI 【参考方案1】:

好吧,我认为data classes 会类似于 Java bean,并且使用它们实际上是一个好主意,因为它消除了样板。

【讨论】:

【参考方案2】:
    您可以通过pickle 模块序列化大多数对象; Python 中没有私有属性之类的东西(另请参见: Does python have 'private' variables in classes?, Actual implementation of private variables in python class); 未定义构造函数的类将使用默认值(根据方法解析顺序)。

构造函数“链”的示例:

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

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

http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html http://python3porting.com/improving.html

【讨论】:

非常感谢您的回复。【参考方案3】:

正如 miku 所指出的:

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

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

    没有可添加到 miku 答案的内容。

关于属性:Real world example about how to use property feature in python?

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

【讨论】:

【参考方案4】:

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

    serializable 和“实现接口”在 Python 中都没有意义(好吧,在某些框架和高级用例中它确实如此,但在这里不是)。序列化模块,例如pickle,无需实现或继承任何特殊功能即可工作(您可以通过其他方式自定义流程,但几乎不需要)。 You don't write getters and setters。您只需使用公共属性。如果您以后需要一个重要的 getter/setter,您可以将其透明地转换为 property。 不需要虚拟构造函数,除非您要创建属性并为其设置默认值。但这可能是一个坏主意(对于一个 bean-ish 类),因为不为这些属性分配值很可能是一个错误,即使不是这样也很可疑。因此,只需让 Python 为您捕获这些错误(当访问不存在的属性时,它会引发 AttributeError)。

【讨论】:

+1:我正要提到那篇文章(“Python 不是 Java”)。 谢谢。我尝试了 Python,我的代码只有一半大小。谢谢!我刚刚发现了一门美妙的语言。我陷入了 Java 变得更好的泡沫之中! namedtuple 实例是不可变的,因此不适合改变状态的对象。【参考方案5】:

实现可序列化。

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

有 getter 和 setter -> 私有属性

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

虚拟构造函数

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

【讨论】:

我会说手动编写代码来将对象与 JSON/YAML/等相互转换。在大多数情况下既没有必要也不可取。 什么时候不应该使用pickle,因为它不安全或速度慢,或者它不能处理你喜欢的对象? 这是替代方案很好的情况之一 ;-) 虽然我希望在许多此类情况下,有一个现有的解决方案可以自动执行此操作,因此您仍然不需要手动编写代码。此外,在最后一种情况下,您始终可以使用copyreg__reduce__ 来自定义pickle 处理您喜欢的对象的方式。

以上是关于Python 中的 JavaBean 等价物的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis练习数据表中的数据封装成JavaBean

JavaBean简介

重新编辑更详细Eclipse中编写JavaBean

Python中的isset()等价物

Kotlin 中的 Python 列表、集合和映射推导等价物是啥?

python中的e.printStackTrace等价物