Heim  >  Fragen und Antworten  >  Hauptteil

python2.7 – Wie erstelle ich nicht feste Klassen mit Python?

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

世界只因有你世界只因有你2664 Tage vor784

Antworte allen(4)Ich werde antworten

  • 扔个三星炸死你

    扔个三星炸死你2017-06-12 09:24:44

    楼主是要动态创建对象吧。可以用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)

    Antwort
    0
  • 滿天的星座

    滿天的星座2017-06-12 09:24:44

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

    eg.

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

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

    Antwort
    0
  • 为情所困

    为情所困2017-06-12 09:24:44

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

    # 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,就可以使用。

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-12 09:24:44

    其实我觉得你应该是想将文件中的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'}
     

    Antwort
    0
  • StornierenAntwort