使用python转换对象的字符串表示形式

时间:2017-12-26 12:09:52

标签: python

我有字符串PyObject [methodCall=1001, attributeName=javax.servlet.jsp.jstl.fmt.request.charset, attributeValue=UTF-8]

在python中我正在上课:

class PyObject:
def __init__(self, methodCall, attributeName, attributeValue):
    self.methodCall = methodCall
    self.attributeName = attributeName
    self.attributeValue = attributeValue

我从socket接收上面的字符串我想将接收到的字符串转换为PyObject的对象,以便我可以访问pyobj.methodCall之类的属性。

我尝试使用json.loads(),但它给了我dict

1 个答案:

答案 0 :(得分:0)

由于您在评论中添加了对此动态要求(您应该将其添加到问题中),请考虑此解决方案。

它不是最美丽或最优雅,但它完成了工作。

此解决方案滥用了使用type动态创建类和实例的功能。

string = 'PyObject [methodCall=1001, attributeName=javax.servlet.jsp.jstl.fmt.request.charset, attributeValue=UTF-8]'

class_name, string = string.split(' ', maxsplit=1)

data = [substring.strip() for substring in string.replace('[', '') \
                                       .replace(']', '').split(',') if substring]

print(data)
# ['methodCall=1001', 'attributeName=javax.servlet.jsp.jstl.fmt.request.charset',
#  'attributeValue=UTF-8']

data_dict = {}
for d in data:
    key, value = d.split('=')
    data_dict[key] = value

print(data_dict)
#  {'attributeValue': 'UTF-8',
#   'attributeName': 'javax.servlet.jsp.jstl.fmt.request.charset', 'methodCall': '1001'}

def init(self, **kwargs):
    for k, v in kwargs.items():
        setattr(self, k, v)

obj = type(class_name, (), {'__init__': init})(**data_dict)
print(obj)
# <__main__.PyObject object at 0x00520C70>
print(obj.methodCall)
# 1001
print(obj.attributeName)
# javax.servlet.jsp.jstl.fmt.request.charset