Ich habe eine Klasse, in der ich eine Rückruffunktion in der Funktion iter zurückgeben muss. Mit Attributen und _... Stil zu bekommen ist es einfach:

class Test(object):
    def __init__(self):
        self.attrib = 'bla'

    def get_attrib(self):
        return self.attrib

    def __iter__(self):
        yield ('attrib',self.get_attrib)

    def __str__(self):
        ret = ''
        for one in self:
            ret += '%s: %s\n'%(one[0],one[1]())
        return ret

print(Test())

Ich möchte pythonischer sein und Eigenschaften verwenden. Aber wie kann ich dasselbe mit dem Getter des Eigentums machen? Weil das nicht funktioniert:

class Test(object):
    def __init__(self):
        self._prop = 'bla'

    @property
    def prop(self):
        return self._prop

    def __iter__(self):
        yield ('prop',self.prop.__get__)

    def __str__(self):
        ret = ''
        for one in self:
            ret += '%s: %s\n'%(one[0],one[1]())
        return ret

print(Test())

Ich habe Folgendes gefunden, aber es erfordert das Objekt selbst als Argument, wenn ich es aufrufe:

def __iter__(self):
        yield ('prop',self.__class__.prop.__get__)

a = Test()
for one in a:
    print '%s: %s'%(one[0],one[1](a)

UPDATE : Ich brauche auch den Setter, aber ich wollte das Beispiel einfach genug machen. Am Ende hätte ich gerne etwas wie:

def __iter__(self):
            yield ('prop',self.prop.__get__,self.prop.__set__)
0
Cajga 1 Dez. 2013 im 15:45

3 Antworten

Beste Antwort

Verwenden Sie einfach ein Lambda:

    yield ('prop',lambda: self.prop)
1
oefe 1 Dez. 2013 im 12:17

Wenn Sie möchten, dass Getter und Setter als Eigenschaft aufrufbar und zugänglich sind, können Sie Folgendes tun

class Test(object):
    def __init__(self):
        self._prop = 'bla'

    def get_prop(self):
        return self._prop

    def set_prop(self, val):
        self._prop = val

    prop = property(get_prop, set_prop)

    def __iter__(self):
        yield ('prop',self.get_prop, self.set_prop)

Sie können jetzt verwenden

test = Test()
test.prop = 'foo'
print(test.prop)

for a in prop:
    name, getter, setter = a
1
Remco Haszing 1 Dez. 2013 im 18:31

Verwenden Sie einfach self.prop und entfernen Sie den Aufruf () aus der Iteration. Hier gibt self.prop die Zeichenfolge ('bla') selbst zurück und Sie versuchen, __get__ für diese Zeichenfolge aufzurufen, was zu einem Fehler führt, da Zeichenfolgen keine {{X5} haben. } Attribut.:

def __iter__(self):
    yield ('prop', self.prop)

def __str__(self):
    ret = ''
    for one in self:
        ret += '%s: %s\n' % (one[0],one[1]) #remove () call from here

Hier entspricht self.prop:

Test.prop.__get__(a)

Update: Verwenden Sie @property nicht, wenn Sie es als Funktion aufrufen möchten:

def prop(self):
    return self._prop

def __iter__(self):
    yield ('prop', self.prop)
0
Ashwini Chaudhary 1 Dez. 2013 im 12:11