python2.7 – Wie erstelle ich nicht feste Klassen mit Python?
世界只因有你
世界只因有你 2017-06-12 09:22:44
0
4
861

Neu bei Python, ich kann nicht finden, wonach ich suchen möchte. Lesen Sie beispielsweise Daten aus einer JSON-Konfigurationsdatei, erstellen Sie dann Klassenobjekte basierend auf den Daten und rufen Sie dann die Methoden dieser Objekte auf. Die Daten dieser JSON-Konfigurationsdatei können frei eingestellt werden. Es kann einen Datensatz geben, der einem Objekt einer Klasse entspricht. Es können auch drei Datensätze vorhanden sein, die drei Objektklassen entsprechen.
Wie schreibe ich Code, um diese JSON-Daten zu lesen und ein Objekt der Klasse zu erstellen?
Zum Beispiel
Klasse Zielobjekt(Objekt):

def __init__(attr1,attr2):

def func1(self):
...

Und unsere JSON-Daten sind... „object1“:{“attr1“: „dawdad“, „attr2“: „dwagfreg“}, „object2“: {“attr1“: „45324523“, „attr2“: „45634“. "},

Die tatsächlichen Daten heißen möglicherweise nicht Objekt1 Objekt2, sondern ein anderer Name. Und nachdem ich diese JSON-Datei gelesen habe, möchte ich ein Objekt der Klasse erstellen und es den Daten in JSON zuweisen

世界只因有你
世界只因有你

Antworte allen(4)
扔个三星炸死你

楼主是要动态创建对象吧。可以用exec 创建

    a = {"object1": {"attr1": "dawdad", "attr2": "dwagfreg"}, "object2": {"attr1": "45324523", "attr2": "45634"}}
    for obj_name in a:
        exec ('class %s(object):pass' % (obj_name))
        for attr in a[obj_name]:
            exec ('%s.%s="%s"' % (obj_name, attr, a[obj_name][attr]))
    print(object1.attr1)

输出 dawdad

你也可以用type 创建

class targetobject(object):
    def __init__(self, attr1, attr2):
        self.attr1 = attr1

    def func1(self):
        pass


if __name__ == '__main__':
    a = {"object1": {"attr1": "dawdad", "attr2": "dwagfreg"}, "object2": {"attr1": "45324523", "attr2": "45634"}}
    for obj_name in a:
        obj = type(str(obj_name), (targetobject,), a[obj_name])
        print(obj)
        print(obj.attr1)
滿天的星座

Python 创建类的时候不一定要给齐成员(也就是说所有Python对象都是不固定的)

eg.

class A:
    pass
a.b = 1             # 可以通过
a.__dict__['c'] = 2 # 使用__dict__获取数据成员
print(a.b) # 1
print(a.c) # 2

所以只要读取Json,再给随便什么对象添加Json里对应的数据成员就好了

为情所困

听楼主好像要的是这种结构:

# coding: utf-8

from collections import namedtuple


obj = {"object1":{"attr1":"dawdad","attr2":"dwagfreg"}, "object2":{"attr1":"45324523","attr2":"45634"}}

obj_insts = []
for obj_name in obj:
    obj_attr = obj[obj_name]
    attrs = obj_attr.keys()
    attr_values = obj_attr.values()
    Obj = namedtuple(obj_name, attrs)
    obj_insts.append(Obj(*attr_values))

print(obj_insts)
print(ibj_insts[0].attr1)
[object1(attr2='dwagfreg', attr1='dawdad'), object2(attr2='45634', attr1='45324523')]
dawdad


如果是配置文件,推荐用toml(https://github.com/toml-lang/...
安装python toml,就可以使用。

伊谢尔伦

其实我觉得你应该是想将文件中的json数据,变成可以操作的对象, 就类似字典那样..看下json库是否满足要求吧:

cat 1.txt:
{"object1":{"attr1":"dawdad","attr2":"dwagfreg"},"object2":"attr1":"45324523","attr2":"45634"}}

# python交互shell
>>> import json
>>> a = json.load(open('1.txt'))
>>> a
{u'object1': {u'attr2': u'dwagfreg', u'attr1': u'dawdad'}, u'object2': {u'attr2': u'45634', u'attr1': u'45324523'}}
>>> a['object1']
{u'attr2': u'dwagfreg', u'attr1': u'dawdad'}
 
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage