Это невозможно. Вы можете определить метод __int__
, чтобы указать, что должно происходить, когда int
вызывается для экземпляра вашего класса, так что int(container.node)
будет 3. Но вы не можете иметь container.node
на самом деле быть 3, тогда как container.node
часть container.node.hello()
- это нечто другое. Оценка ссылок на атрибуты в container.node.hello()
происходит слева направо, поэтому container.node
оценивается без «знания», что вы позже попытаетесь вызвать метод для него.
Как Патрик Хау предлагает в своем ответе, вы можете подкласс int
, так что container.node
- это то, что ведет себя как число 3, но также имеет метод .hello()
. Но все же вы не заставляете container.node
иметь разные значения в разных контекстах; вы заставляете его иметь одно значение, которое объединяет нужные вам функции в двух контекстах. На самом деле это значение не 3
, а экземпляр Node, который может иметь значение в некоторых ситуациях. Тем не менее, это часто может быть законным способом достижения эффекта, подобного тому, что вы, похоже, хотите.
Можно также использовать __setattr__
, чтобы container.node = 3
установило значение, отличное от 3 (например, для некоторого объекта-оболочки), но это не изменит вышеприведенного. Когда вы оцениваете container.node
, оно может иметь только одно значение во всех контекстах.