2017-02-15 7 views
0

は、どのように私は以下のクラスが使用するように変換することができますattrs libraryPythonのATTRSライブラリおよび参照するインスタンスメソッド

class MyClass(object): 
    def __init__(self, api, template=None, **kwargs): 
     self.api = api 
     self.param1 = param1 
     if template is not None: 
      self.template = api.get_template(desc=template) 

具体的に、どのように私は別の初期化の一つのパラメータの依存性に対処するのですか?私の最初の試みで、私はこのようなクラスを開始しました:

@attr.s 
class MyAttrClass(object): 
    api = attr.ib() 
    param1 = attr.ib() 

しかし、私はtemplate属性に対処する方法がわからないのですか?

def __attrs_post_init__(self): 
    self.template = api.get_template(desc=template) 

これを行うにはもっと良い方法があるのでしょうか?

答えて

0

あなたの質問から「param1」は続くことが難しく、私は「kwargs」から来ると仮定することができますか?

@attr.s 
class MyAttrClass(object): 
    api = attr.ib() 
    template = attr.ib(default=None) 
    param1 = attr.ib() 

    def __attrs_post_init__(self): 
     if self.template is not None: 
      self.template = api.get_template(desc=template) 

は、template属性に対処するための実行可能なソリューションであること、しかし、私はまだ午前解決することはkwargsからに対処する方法である必要があります。私はそれを見ているので、見つけたら解決策を投稿します。

1

私は​​があなたに役立つかもしれないと思います。私はここを参照してくださいだと思う

一つの問題は、それはあなたがself.template(おそらくTemplate)として設定したものよりももの(おそらくstr)の異なる種類だようにあなたがルックスを持つテンプレートと呼ばれる引数を取っているということです。これらの名前を付けて、次のようにしてください:

from attr import Factory, attrib, attrs 
from attr.validators import instance_of 

from my.code import API, Template 

@attrs 
class Foo(object): 
    api = attrib(validator=instance_of(API)) 

    _template_name = attrib(validator=instance_of(str)) 

    template = attrib(
     validator=instance_of(Template), 
     default=Factory(
      lambda self: self.api.get_template(self._template_name) 
     ), 
     takes_self=True, 
     init=False, 
    ) 
関連する問題