ホームページ >バックエンド開発 >Python チュートリアル >Python は、JSON ストレージと解析をサポートするオブジェクトを実装します。

Python は、JSON ストレージと解析をサポートするオブジェクトを実装します。

高洛峰
高洛峰オリジナル
2017-03-23 16:08:101310ブラウズ

JSON モジュールを使用すると、Python基本型 (dict、list など) データをファイルに永続的に保存することができます。同時に、カスタム変換 function および を通じてカスタム クラスを実装することもできます。継承ストレージの JSON エンコードとデコード メソッド。この記事は、JSON ストレージをサポートする Python の オブジェクト を実装するための以前の「Python JSON モジュール」に基づいています。

オブジェクトが JSON を保存および解析できることは非常に理にかなっています。たとえば、機械学習におけるすべての分類アルゴリズムのトレーニング プロセスでは、大量のデータが計算されます。分類を開始するたびに分類アルゴリズムを再トレーニングする必要がある場合、リソースの無駄であり、非効率的です。トレーニングによって生成されたアルゴリズム オブジェクトは保存でき、必要な場合を除いて、後からアルゴリズム チューニングをロードするだけで済みます。一方で、オブジェクトが JSON を解析して保存できるため、オブジェクトをネットワーク経由で送信することもできます。これは、現在のクラウド コンピューティングや分散データ処理において非常に重要です。

自己ストレージと解析を実現するために、オブジェクトを定義する主な操作は次のとおりです:

0、object_json.py copyをパッケージに追加し、オブジェクトを定義するモジュールを object_json にインポートします。 object_json をインポートします。

1. init() 関数は、可変数の関数呼び出しをサポートする必要があります。つまり、init(self, …, , **args) として記述する必要があります。この方法でオブジェクトを定義することによってのみ、構築段階で初期化する必要がある属性以外の属性を持つことができます。

2. オブジェクト構築フェーズ中に初期化する必要がある属性の場合、オブジェクトが辞書 'key を通じて構築できるように、init() 関数の仮パラメータはこれらの属性の名前とまったく同じである必要があります。 ': 値のペア。

3. 属性「name」を定義します。これは、検査モジュールを使用して実装されたオブジェクト インスタンスの名前です。 「name」属性は主に、オブジェクトを保存するときにデフォルトのファイル名を生成するために使用されます。

4、jsonDumps() メソッドと jsonLoadTransfer() メソッドを定義し、objectLoadFromFile() を通じてオブジェクト JSON ファイルの読み込みと新しいオブジェクトの作成を完了します。

(i) jsonDumps() は、オブジェクトを dict に変換し、json.dumps() を通じてオブジェクトを json ファイルに保存するために使用されます。ユーザーがファイル名を指定しない場合、instancename.json がデフォルトの保存ファイルになります。 JSON は Python の基本型のみをサポートするため、オブジェクト内に他の型 (numpy 行列など) がある場合は、それらを Python の基本型 (行列をリストに変換する matrix.tolist() など) に変換する必要があります。

(ii) jsonLoadTransfer() は、データ形式の変換を完了し、一部のオブジェクト属性を基本型から必須型に変換するために使用されます (オブジェクトにのみ型が含まれている場合、リストから行列に型を変換する mat (list) など)。 Pythonの基本型の場合、このメソッドは省略可能です。完全で使用可能なオブジェクトを作成するプロセスは次のとおりです。

obj = objectLoadFromFile()   
obj.jsonLoadTransfer()

次のコードは、JSON ストレージと解析用のカスタム オブジェクトをサポートする object_json モジュールのソース コードです。

import json   
import inspect    
import pdb   
def object2dict(obj):      
    #convert object to a dict      
    d = {'class':obj.class.name, 'module':obj.module}      
    d.update(obj.dict)      
    return d   
def objectDumps2File(obj, jsonfile):   
    objDict = object2dict(obj)   
    with open(jsonfile, 'w') as f:   
        f.write(json.dumps(objDict))   

def dict2object(d):      
    '''convert dict to object, the dict will be changed'''       
    if'class' in d:      
        class_name = d.pop('class')      
        module_name = d.pop('module')      
        module = import(module_name)      
        #print 'the module is:', module      
        class_ = getattr(module,class_name)      
        args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args     
        #print 'the atrribute:', repr(args)   
        #pdb.set_trace()   
        inst = class_(**args) #create new instance      
    else:      
        inst = d      
    return inst   
def objectLoadFromFile(jsonFile):   
    '''load json file and generate a new object instance whose name filed  
    will be 'inst' '''  
    with open(jsonFile) as f:   
        objectDict =json.load(f)   
    obj = dict2object(objectDict)   
    return obj   
#test function      
if name  == 'main':   
    class Person(object):      
        def init(self,name,age, **args):   
            obj_list = inspect.stack()[1][-2]   
            self.name = obj_list[0].split('=')[0].strip()#object instance name   
            self.name = name      
            self.age = age   

        def repr(self):      
            return 'Person Object name : %s , age : %d' % (self.name,self.age)   
        def say(self):   
            #d = inspect.stack()[1][-2]   
            #print d[0].split('.')[0].strip()   
            return self.name  
        def jsonDumps(self, filename=None):   
            '''essential transformation to Python basic type in order to  
            store as json. dumps as objectname.json if filename missed '''  
            if not filename:   
                jsonfile = self.name+'.json'   
            else: jsonfile = filename   
            objectDumps2File(self, jsonfile)   

        def jsonLoadTransfer(self):#TBD   
            '''essential transformation to object required type,such as  
            numpy matrix.call this function after newobject = objectLoadFromFile(jsonfile)'''  
            pass  

    p = Person('Aidan',22)        
    #json.dumps(p)#error will be throwed   

    #objectDumps2File(p,'Person.json')   
    p.jsonDumps()   
    p_l = objectLoadFromFile('p.json')   

    print 'the decoded obj type: %s, obj:%s' % (type(p_l),repr(p_l))

Python クラスには古いクラスと新しいクラスの 2 種類があります。py 2.2 以降でオブジェクトを継承する目的は、このクラスを新しいスタイルのクラスにすることです (オブジェクトを継承しないものは、最終的にはオブジェクトを継承します)。 。

クラス定義内の次の 2 つのメソッド:

class Person():   
class Person(object)

違いは次のとおりです:

新しい Person インスタンス テストを作成する場合、タイプ (テスト) の出力は次のとおりです:

<type &#39;instance&#39;>   
<class &#39;main.Person&#39;>

検査モジュールは一連のイントロスペクション関数を提供します、モジュール、クラス、メソッド、関数、トレースバック、フレーム オブジェクト、およびコード オブジェクトに関する情報を取得できます。一般的に使用されるメソッドは、getmembers、ismodule、getcallargs、isclass などです。

以上がPython は、JSON ストレージと解析をサポートするオブジェクトを実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。