Там нет никакого способа сделать это без создания какого-то класса-оболочки, которая делегирует вызовы к лежащему в основе «гусеничного» объект.
Каждая операция над объектом в конечном итоге контролируется с помощью его пробоотборников. print
, например, звонки __str__
, s + '.'
первые звонки __add__
, абонентские звонки __getitem__
. Вам необходимо определить поведение «по доступу» в этих функциях.
Быстрый основной рецензия, который представляет функциональность в ваших примерах может выглядеть следующим образом:
class Wrap(object):
access_str = "object with id={} has been accessed"
def __init__(self, obj):
self._obj = obj
def __add__(self, v):
print(self.access_str.format(self._obj))
# If you want the result to be tracked
# return Wrap(self._obj + v)
return self._obj + v
def __repr__(self):
print(self.access_str.format(self._obj))
return repr(self._obj)
def __str__(self):
print(self.access_str.format(self._obj))
return str(self._obj)
это, очевидно, не хватает остальной части методов, необходимых, но это то, что вы должны сделать, если вы идете вниз по этому маршруту.
Теперь вы взаимодействуете с ним, как вы бы с любой строкой:
>>> s = Wrap("Hello World")
>>> print(s)
object with id=140023929394880 has been accessed
Hello World
>>> s + '.'
object with id=140023929394880 has been accessed
'Hello World.'
Это, очевидно, может быть изменен, например, в __init__
вы могли бы заставить требование для name
аргумент, который вы бы затем связать в с использованием globals()
.
Кроме того, вы можете создать метакласс, который автоматически генерирует похожие методы dunder в зависимости от типа.
Точка есть, нет встроенного способа сделать это, вам нужно сделать это самостоятельно в некоторой утомительной манере.
Не могли бы вы определить, что делает и не считается «доступом»? – wim
Да, я не думаю, что приведенные вами примеры делают ваш вопрос ясным. –
Похоже, вам просто нужна оболочка функции. 'def s(): print 'access'; return 'some string''. – TigerhawkT3