Ich habe eine Klasse, die durch Rücksendung der Attribute seiner „Reihe“ Attribut, entlang der folgenden Zeilen Objektattribut Zugriff Überlastungen:Ist es möglich, einen Aufruf von Vars (Objekt) in Python zu überladen?
from collections import namedtuple
class MyObj(object):
def __init__(self, y, z):
r = namedtuple('row', 'a b')
self.row = r(y, z)
self.arbitrary = True
def __getattr__(self, attr):
return getattr(self.row, attr)
def __dir__(self):
return list(self.row._fields)
In [2]: m = MyObj(1, 2)
In [3]: dir(m)
Out[3]: ['a', 'b']
In [4]: m.a
Out[4]: 1
In [5]: vars(m)
Out[5]: {'arbitrary': True, 'row': row(a=1, b=2)}
In [6]: output = '{a} -> {b}'
In [7]: output.format(**vars(m.row))
Out[7]: '1 -> 2'
In [8]: output.format(**vars(m))
KeyError: 'a'
Da ich ziemlich oft Zeichenfolge Formatierung mit vars() Ich mag würde zu auf die Zeilen Attribute direkt vom Aufruf von vars() zugreifen können. Ist das möglich?
bearbeiten folgende aaronsterling Antwort
Der Schlüssel dies zu lösen, dank Aarons Zeiger, für __dict__
in __getattribute__
from collections import namedtuple
class MyObj(object):
def __init__(self, y, z):
r = namedtuple('row', 'a b')
self.row = r(y, z)
self.arbitrary = True
def __getattr__(self, attr):
return getattr(self.row, attr)
def __getattribute__(self, attribute):
if attribute == '__dict__':
return self.row._as_dict()
else:
return object.__getattribute__(self, attribute)
def __dir__(self):
return list(self.row._fields)
In [75]: m = MyObj(3, 4)
In [76]: m.a
Out[76]: 3
In [77]: vars(m)
Out[77]: OrderedDict([('a', 3), ('b', 4)])
Ist das für 2.7? – aaronasterling
@Aaronasterling: Ja, ich hätte erwähnen sollen, dass dies für Python 2.7 – rorycl