2016-11-25 44 views
0

我想控制被訪問的變量。我試圖在pyjack模塊的幫助下實現它,但方法pyjack.connect(my_str,proxyfn = my_proxyfn)拋出異常...type '<type 'str'>' not supported在Python中是否有一種機制可以攔截對象的訪問?

這裏是我想要的一個例子:

>>> def on_access(obj): 
... print 'object with id=%d has been requested' % id(obj) 
... 
>>> s = 'some string' 
>>> 
>>> foo(s, handler=on_access) 
>>> 
>>> print s 
object with id=4559856664 has been requested 
some string 
>>> 
>>> s + '.' 
object with id=4559856664 has been requested 
some string. 

UPD:這是很重要的對象保留其類型。

在實例的後續:

>>> import json 
>>> 
>>> json.dumps(s) 
object with id=4559856664 has been requested 
'"some string"' 
+1

你能更好地定義什麼和不算作「訪問」? – wim

+0

是的,我不認爲你發佈的例子使你的問題清晰。 –

+0

看起來你只是想要一個函數包裝器。 'def s():print'access';返回'一些字符串'。 – TigerhawkT3

回答

0

有沒有辦法做到這一點,而無需創建某種形式的包裝類的各位代表調用底層的「追蹤」對象。

對象的每個操作最終都是通過使用它的dunders來控制的。例如,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方法。

要點是,沒有內置的方式來做到這一點,你需要自己做一些乏味的方式。

相關問題