关于java:Python中的JavaBean等价物

JavaBean equivalent in Python

我对使用Python作为OOP还比较陌生。我来自Java后台。如何用Python编写一个JavaBean等价物?基本上,我需要一门课:

  • 实现可序列化。
  • 具有getter和setter->private属性
  • 虚拟构造函数
  • 任何输入?我在找一个示例代码!


    你不知道,因为Python不是Java。最有可能的情况是,您应该编写一个不那么简单的类,构造一个namedDuple,传递一个字典,或者类似的东西。但要回答这个问题:

  • 无论是serializable还是"实现接口"在Python中都没有意义(在某些框架和高级用例中,它有意义,但在这里没有意义)。序列化模块,如pickle,工作时不需要实现或继承任何特殊的东西(您可以用其他方式自定义流程,但几乎不需要)。
  • 你不会写getter和setter。你只需要使用公共属性。如果您以后需要一个重要的getter/setter,您可以透明地将其转换为property
  • 不需要虚拟构造函数,除非您想创建属性并为它们设置默认值。但这可能是一个坏主意(对于一个bean ish类来说),因为不为这些属性赋值很可能是一个错误,即使它不是,也是可疑的。所以让python为您捕获这些错误(当访问一个不存在的属性时,它会引发AttributeError)。

  • 您可以通过pickle模块序列化大多数对象;
  • python中没有私有属性(另请参见:
    • python在类中有"private"变量吗?,
    • python类中私有变量的实际实现);
  • 未定义构造函数的类将使用默认值(根据方法解析顺序)。
  • 构造函数"chain"的示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> class A(object):
    ...     def __init__(self):
    ...         print("A")
    ...    
    ...
    >>> class B(A): pass # has no explicit contructor
    ...
    >>> b = B()
    A
    >>>

    而且,正如@德尔南所写的——你可能想读:HTTP://DrtSimul.Org/No.44/12/python IS-NOT-JavaHTML-- Java和Python有着截然不同的文化,需要花费一些时间来钻研(和欣赏)两者。

    另外,在编写了一些代码之后,将其与这里列出的常见习惯用法进行比较可能会有所帮助(我当然从中学到了很多东西):

    • http://www.jeffknupp.com/blog/2012/10/04/writing-jametic-python/
    • http://python.net/~goodger/projects/pycon/2007/惯用语/讲义.html
    • http://python3porting.com/improving.html


    Implements serializable.

    选择您最喜欢的格式,并编写一个函数来为您序列化它。JSON,泡菜,山药,任何工作。决定吧!

    Has getters and setters -> private properties

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

    dummy constructor

    同样,我们并不担心,因为我们的构造器比其他语言更聪明一点。因此,您只需定义一个__init__,它就可以进行所有的初始化,如果您必须编写一个工厂或对其进行子类化的话。


    正如米库所指出的:

  • 对象可以由PICKE模块序列化,但没有实现接口,Python不是Java。

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

  • 没有什么可以添加到Miku的答案中。

  • 关于属性:关于如何在Python中使用属性特性的真实世界示例?

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