Jak uzyskać wszystkie nazwy właściwości python class , w tym te właściwości odziedziczone po super klasach?Jak uzyskać dostęp do właściwości superklas Pythona, np. przez __class __.__ dict__?
class A(object):
def getX(self):
return "X"
x = property(getX)
a = A()
a.x
'X'
class B(A):
y = 10
b = B()
b.x
'X'
a.__class__.__dict__.items()
[('__module__', '__main__'), ('getX', <function getX at 0xf05500>), ('__dict__', <attribute '__dict__' of 'A' objects>), ('x', <property object at 0x114bba8>), ('__weakref__', <attribute '__weakref__' of 'A' objects>), ('__doc__', None)]
b.__class__.__dict__.items()
[('y', 10), ('__module__', '__main__'), ('__doc__', None)]
Jak mogę uzyskać dostęp do właściwości a via b? Potrzebujesz: "Podaj mi listę wszystkich nazw nazwisk od b włącznie z odziedziczonymi po!"
>>> [q for q in a.__class__.__dict__.items() if type(q[1]) == property]
[('x', <property object at 0x114bba8>)]
>>> [q for q in b.__class__.__dict__.items() if type(q[1]) == property]
[]
Chcę uzyskać wyniki od pierwszego (a), podczas pracy z drugim (b), ale bieżący tylko może uzyskać pustą listę. To również powinno działać dla drugiego C odziedziczone B.
Zauważ, że 'y' nie jest właściwością , to tylko liczba całkowita. Czy chcesz mieć wszystkie zmienne klasy, które nie są funkcjami? –
Zamiast "getX", miej 'get_x', jeśli interesujesz się stylem Python ([PEP 8] (http://www.python.org/dev/peps/pep-0008/)), lub jeśli nie masz t musi być w stanie wykonać wersję wywołania funkcji (będziesz, jeśli kiedykolwiek pójdziesz ustawiać właściwość przez 'super()' --- 'super (...). x = 'Y'' zawiedzie), po prostu użyj 'własność' jako dekorator, jako' @ właściwość', 'def x (self): return 'X''. –
Dzięki za te komentarze. Próbowałem stworzyć prosty przykład zamiast mojego złożonego kodu i tak, w związku z tym nie myślałem o PEP8. Nie dbam o to "y", ponieważ potrzebuję tylko właściwości. – user1156548