缘起
过去一直使用Java作为主编程语言,近期开始对Python感兴趣。很多时候,天然带上些Java的编程模式与思想。
Python在实现web请求时,request参数时常是通过dict对象,相当自由。
在使用Java时,我们常用POJO对象进行一组属性的传递,而在Python就很少见。
如何在Python实现类似Java的POJO对象?
有明确数量的属性 每个属性有明确的名称(区分大小写) 可序列化与反序列化设计
按如上要求,我写了一个超类Simple
class Simple(object):
"""
POJO属性对象
.. 用法示例:
class Foo(Simple):
__slots__ = ('x', 'y', 'z')
def __init__(self, **kwargs):
super().__init__(**kwargs)
"""
__slots__ = ()
def __init__(self, **kwargs):
for k in kwargs.fromkeys(self.__slots__):
if k in kwargs:
setattr(self, k, kwargs[k])
@property
def json(self):
return {s: getattr(self, s) for s in self.__slots__ if hasattr(self, s)}
使用
场景假设,有一个request请求,使用json参数,参数要求4个,分别为
app: str, 必须 name: str, 必须 ackType: int, 必须 message: str, 可选按如上要求,我们设计了一个类EventAck
class EventAck(Simple):
__slots__ = ('app', 'name', 'ackType', 'message')
def __init__(self, **kwargs):
super().__init__(**kwargs)
我们可以这样使用
...
params = EventAck(app='test', name='iamtestname')
if self._EVENT_TYPE_HEART == event_type:
params.ackType = 0
requests.post(url, json=params.json)
return
if self._EVENT_TYPE_MSG == event_type:
bookkeeping = Bookkeeping(**json.loads(data))
params.ackType = 1
params.message = bookkeeping.id
requests.post(url, json=params.json)
if not self.is_already_received(bookkeeping.id):
self.mark_received(bookkeeping.id)
if bookkeeping.action in self.listener_map:
for listener in self.listener_map[bookkeeping.action]:
listener.process(bookkeeping)
...
说明:
明确数量及名称的属性,通过 __slots__ 限定,所有不在 __slots__ 内的属性都会抛出错误,我们可以认为 __slots__ 里定义的就是类java POJO对象的属性 序列化:通过超类Simple定义的json把Python对象序列化为dict 反序列化:通过 __init__(self, **kwargs) 从dict中反序列化成Python对象声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did126694