2017-02-15 1 views
0

Wie kann ich konvertieren die Klasse unten verwenden, um die attrs library:Python attrs Bibliothek und Referenzierung Instanzmethoden

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) 

Insbesondere, wie kann ich mit der Abhängigkeit eines Parameters auf die Initialisierung eines anderen umgehen? In meinem ersten Versuch, begann ich mit einer Klasse wie folgt aus:

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

Aber ich bin nicht sicher, wie mit dem template Attribut umgehen? Mein erster Gedanke war zu tun:

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

Ich frage mich, ob es eine bessere Möglichkeit, dies zu erreichen, obwohl?

Antwort

0

'param1' von Ihrer Frage ist schwer zu folgen, und ich kann nur davon ausgehen, dass es von 'Kwargs' kommt?

@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) 

sollte eine praktikable Lösung sein, mit dem Template-Attribute zu behandeln, aber ich bin, was noch zu lösen, wie mit dem kwargs beschäftigen. Ich schaue mir das selbst an, also werde ich eine Lösung veröffentlichen, sobald ich eine gefunden habe.

1

Ich denke, die takes_self argument to Factory kann Ihnen nützlich sein.

Ein Problem, das ich denke, dass ich hier sehe ist, dass Sie ein Argument nehmen genannt Vorlage mit sieht aus wie es eine andere Art der Sache ist (vielleicht ein str) als das, was Sie setzen als self.template (vielleicht ein Template). Ich schlage vor, Sie geben diese verschiedenen Namen, und dann tun Sie etwas wie folgt:

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, 
    ) 
Verwandte Themen