我使用Python作为OOP相当新 . 我来自Java背景 . 你会如何在python中编写一个javabean等价物?基本上,我需要一个类:
实现可序列化 .
有吸气剂和二传手 - >私人 property
虚拟构造函数
有什么投入?我正在寻找示例代码!
你没有,因为Python is not Java . 你最有可能只是写一个不那么琐碎的类,构造一个namedtuple,传递一个字典,或类似的东西 . 但要回答这个问题:
在Python中都没有 serializable 和"implementing an interface"是有意义的(好吧,在某些框架和高级用例中它确实如此,但不是在这里) . 序列化模块(例如pickle)可以在不实现或继承任何特殊内容的情况下工作(您可以通过其他方式自定义该过程,但您几乎不需要) .
serializable
You don't write getters and setters . 您只需使用公共属性 . 如果您以后需要一个非常重要的getter / setter,您可以透明地将它变成 property .
property
这可能是一个坏主意(对于bean-ish类),因为没有为这些属性赋值很可能是一个错误,即使它不是,也是可疑的 . 因此,让Python为您捕获这些错误(当访问不存在的属性时,它会引发 AttributeError ) .
AttributeError
您可以通过pickle模块序列化大多数对象;
Python中没有私有属性这样的东西(参见:
Does python have 'private' variables in classes?,
Actual implementation of private variables in python class);
未定义构造函数的类将使用默认值(根据方法解析顺序) .
构造函数'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有着截然不同的文化,需要一些时间来深入研究(并欣赏)两者 .
另外,在编写了一些代码之后,将它与常用习语进行比较可能会有所帮助,如下所示(我当然通过这种方式学到了很多东西):
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
选择您喜欢的格式,并编写一个将为您序列化的函数 . JSON,Pickle,YAML,任何工作 . 刚决定!
我们在这里不这样做,那些是束缚语言的属性,我们都是这种语言的成年人 .
再次不是我们真正担心的事情,因为我们的构造函数比其他语言更聪明 . 因此,您只需定义一个 __init__ ,它就可以完成所有初始化,如果您必须编写工厂或子类 .
__init__
正如miku指出的那样:
对象可以通过picke模块序列化,但是没有要实现的接口,Python不是Java .
python中没有私有属性,通常人们使用 bar (下划线)来表示私有属性,但可以从外部世界访问它们 . 吸气剂和制定者浪费了CPU和程序员的时间 .
没有什么可以添加到miku的答案 .
关于 properties :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,传递一个字典,或类似的东西 . 但要回答这个问题:
在Python中都没有
serializable
和"implementing an interface"是有意义的(好吧,在某些框架和高级用例中它确实如此,但不是在这里) . 序列化模块(例如pickle)可以在不实现或继承任何特殊内容的情况下工作(您可以通过其他方式自定义该过程,但您几乎不需要) .You don't write getters and setters . 您只需使用公共属性 . 如果您以后需要一个非常重要的getter / setter,您可以透明地将它变成
property
.这可能是一个坏主意(对于bean-ish类),因为没有为这些属性赋值很可能是一个错误,即使它不是,也是可疑的 . 因此,让Python为您捕获这些错误(当访问不存在的属性时,它会引发
AttributeError
) .您可以通过pickle模块序列化大多数对象;
Python中没有私有属性这样的东西(参见:
Does python have 'private' variables in classes?,
Actual implementation of private variables in python class);
未定义构造函数的类将使用默认值(根据方法解析顺序) .
构造函数'chain'的示例:
并且 - 正如@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
选择您喜欢的格式,并编写一个将为您序列化的函数 . JSON,Pickle,YAML,任何工作 . 刚决定!
我们在这里不这样做,那些是束缚语言的属性,我们都是这种语言的成年人 .
再次不是我们真正担心的事情,因为我们的构造函数比其他语言更聪明 . 因此,您只需定义一个
__init__
,它就可以完成所有初始化,如果您必须编写工厂或子类 .正如miku指出的那样:
对象可以通过picke模块序列化,但是没有要实现的接口,Python不是Java .
python中没有私有属性,通常人们使用 bar (下划线)来表示私有属性,但可以从外部世界访问它们 . 吸气剂和制定者浪费了CPU和程序员的时间 .
没有什么可以添加到miku的答案 .
关于 properties :Real world example about how to use property feature in python?
好文:http://dirtsimple.org/2004/12/python-is-not-java.html