to jest pierwszy raz, kiedy piszę tutaj, przepraszam, jeśli wiadomość jest nieaktualna lub zbyt długa.Asymetryczne zachowanie dla __getattr__, newstyle vs oldstyle classes
Chciałbym dowiedzieć się więcej o tym, jak ładunki obiektów są pobierane w razie potrzeby. Tak więc przeczytałem dokumentację Pythona 2.7 o nazwie "Model danych" here, poznałem __getattr__
i, w celu sprawdzenia, czy zrozumiałem jego zachowanie, czy nie, napisałem te proste (i niekompletne) owijki tekstowe.
class OldStr:
def __init__(self,val):
self.field=val
def __getattr__(self,name):
print "method __getattr__, attribute requested "+name
class NewStr(object):
def __init__(self,val):
self.field=val
def __getattr__(self,name):
print "method __getattr__, attribute requested "+name
Jak widać są one takie same, z wyjątkiem bycia klasą oldstyle vs newstyle. Ponieważ cytowany tekst mówi, że __getattr__
jest "Wywoływany, gdy wyszukiwanie atrybutów nie odnalazło atrybutu w zwykłych miejscach", chciałem wypróbować operację + na dwóch wystąpieniach tych klas, aby zobaczyć, co się stało, spodziewając się identycznego zachowania.
Ale wyniki mam zastanawiało mnie trochę:
>>> x=OldStr("test")
>>> x+x
method __getattr__, attribute requested __coerce__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
Good! Nie zdefiniowałem metody dla __coerce__
(chociaż oczekiwałem prośby o __add__
, nevermind :), więc __getattr__
zaangażowałem się i zwróciłem bezużyteczną rzecz. Ale wtedy
>>> y=NewStr("test")
>>> y+y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NewStr' and 'NewStr'
Dlaczego ta asymetryczna zachowanie między __getattr__
w Oldstyle klas i jedynek Newstyle przy użyciu wbudowanego operatora jak +? Czy ktoś mógłby mi pomóc zrozumieć, co się dzieje i jaki był mój błąd przy czytaniu dokumentacji?
Bardzo dziękuję, twoja pomoc jest bardzo cenna!
Proszę nie używać klas starego stylu do czegokolwiek. Są przestarzałe z oczywistych powodów - takich jak ten. Ponieważ są przestarzałe, wiedza o tym, jak działają, nie jest pomocna. Odrzuć je i idź dalej, proszę. –
Porównanie zachowania starych i nowych klas pomaga zilustrować działanie klas w nowym stylu, zwłaszcza jeśli znasz klasy w starym stylu. Rzeczywiście nie jest zaskakujące, że działają na różne sposoby, a pocieszające jest, że nowe zajęcia działają zgodnie z oczekiwaniami. Mimo to warto zrozumieć, dlaczego kod jest interpretowany w taki sposób, w jaki jest on niezależny od wersji. –