2016-07-13 1 views
2

私はPythonオブジェクトをjsonに変換するためのエンコーダを作成しています。リサーチするときにはdefaultメソッドを含む多くのソリューションがあります。私はPythonの専門家ではありませんが、どちらも初心者ではありません。クラスが呼び出されたときに自動的に実行されるdefaultメソッドが何らかの形で見逃されているかどうかは疑問です。または、これは、私がJSONEcoderクラス(デフォルトのメソッドを持ち、現在はオーバーライドしています)から継承したためですか?誰かが明確にすることはできますか?そしてもしそうなら、それはPythonのdefault()メソッド

__init__() 

方法と同じで、基本的には?

class ComplexEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, my_custom_object): 
      return str(obj) 
     return json.JSONEncoder.default(self, obj) 

答えて

3

JSONEncoderは、それが有効に特定のオブジェクトを強制する方法を知らない場合に呼び出されるdefault方法があります:あなたは、視覚の多くを必要とする場合はところで

は、私のエンコーダは、このようになります。 JSON。デフォルトの実装では、TypeErrorが呼び出されます(型を強制する方法がわからないため)。ただし、がデフォルトのメソッドをオーバーライドすると、エンコーダーが処理するオブジェクトを返す機会があります。は処理方法を知っています。 入力タイプの処理方法がわからない場合(例:my_custom_typeのインスタンスではない場合)はraise TypeErrordefaultメソッドをJSONencoderと呼び、エラーが発生する可能性があります。しばしば、あなたは協調的継承のためにここで使用されるsuper

が表示されます:あなたが構築

class ComplexEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, my_custom_object): 
      return str(obj) 
     return super(ComplexEncoder, self).default(obj) 

場合は、すべてのエンコーダクラスは、この形式のものであり、あなたはそれらを一緒に混在させることができます:

class MySuperEncoder(ComplexEncoder, WidgetEncoder, FooEncoder): 
    pass 

今度はComplexEncoderが知っていることを処理します(例えばmy_custom_object)。WidgetEncoderは、処理方法を知っているものをエンコードします(おそらくWidgetインスタンス)などがあります。 dir(JSONEncoder)を走っ

2

は私達を与える:

['__class__', 
'__delattr__', 
'__dict__', 
'__doc__', 
'__format__', 
'__getattribute__', 
'__hash__', 
'__init__', 
'__module__', 
'__new__', 
'__reduce__', 
'__reduce_ex__', 
'__repr__', 
'__setattr__', 
'__sizeof__', 
'__str__', 
'__subclasshook__', 
'__weakref__', 
'default', # We found our method, let's see what it does 
'encode', 
'item_separator', 
'iterencode', 
'key_separator'] 

help(JSONEncoder.default)を実行している私たちを与える:

default(self, o) unbound json.encoder.JSONEncoder method 
    Implement this method in a subclass such that it returns 
    a serializable object for ``o``, or calls the base implementation 
    (to raise a ``TypeError``). 

    For example, to support arbitrary iterators, you could 
    implement default like this:: 

     def default(self, o): 
      try: 
       iterable = iter(o) 
      except TypeError: 
       pass 
      else: 
       return list(iterable) 
      # Let the base class default method raise the TypeError 
      return JSONEncoder.default(self, o) 

だから、それはあなたがこのオブジェクトをサブクラス化する必要があり、それはあなたがあなた自身を記述するために、このように設計されてい思われます。

1

この方法はjson.JSONEncoderで定義されていると思います(here)。 default(o)は、指定されたオブジェクトのシリアライズ可能なバージョンを返すか、スーパークラスに渡す必要があります。

+0

ええ、それは私のようなものも考え始めたことです。 default()が私が知らなかったある種の「魔法」だったかどうかは分かりませんでした。ありがとう! – AmericanMade

関連する問題