это первый раз, когда я пишу здесь, извините, если сообщение не указано или слишком длинное.
Мне было интересно узнать больше о том, как атрибуты объектов выбираются при необходимости. Поэтому я прочитал документацию по Python 2.7 под названием «Модель данных» здесь , я встретил __getattr__
и, чтобы проверить, понял ли я ее поведение, я написал эти простые (и неполные) оболочки строк.
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
Как вы можете видеть, они одинаковы, за исключением того, что они являются классами старого стиля и нового стиля. Поскольку в цитируемом тексте написано, что __getattr__
«Вызывается, когда поиск атрибута не нашел атрибут в обычных местах», я хотел попробовать операцию + на двух экземплярах этих классов, чтобы посмотреть, что произошло, ожидая идентичного поведения.
Но результаты, которые я получил, меня немного озадачили:
>>> 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
Хорошо! Я не определил метод для __coerce__
(хотя я ожидал запрос на __add__
, неважно :), поэтому __getattr__
вмешался и возвратил бесполезную вещь. Но тогда
>>> 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'
Почему это асимметричное поведение между __getattr__
в классах старого и нового классов при использовании встроенного оператора, такого как +? Может ли кто-нибудь помочь мне понять, что происходит, и в чем была моя ошибка при чтении документации?
Большое спасибо, ваша помощь очень ценится!