2015-10-15 76 views
0

我開始使用Python 3進行OOP,我發現property的概念確實很有趣。在Python中創建列表屬性

我需要封裝一個私人列表,但我怎麼能用這個範例的列表?

這裏是我的幼稚的嘗試:

class Foo: 
    """ Naive try to create a list property.. and obvious fail """ 

    def __init__(self, list): 
     self._list = list 

    def _get_list(self, i): 
     print("Accessed element {}".format(i)) 
     return self._list[i] 

    def _set_list(self, i, new): 
     print("Set element {} to {}".format(i, new)) 
     self._list[i] = new 

    list = property(_get_list, _set_list) 

預期這並不表現甚至讓蟒蛇崩潰,當我嘗試下面的代碼。這是我想Foo展示的虛擬行爲:

>>> f = Foo([1, 2, 3]) 
>>> f.list 
[1, 2, 3] 
>>> f.list[1] 
Accessed element 1 
2 
>>> f.list[1] = 12 
Set element 1 to 12 
>>> f.list 
[1, 12, 3] 
+0

是'print's重要? –

+0

@AnandSKumar是的,因爲它們實際上代表了我使用'i'和'new'的值執行的其他類成員的進一步更新。 –

回答

2
import collections 


class PrivateList(collections.MutableSequence): 
    def __init__(self, initial=None): 
     self._list = initial or [] 

    def __repr__(self): 
     return repr(self._list) 

    def __getitem__(self, item): 
     print("Accessed element {}".format(item)) 
     return self._list[item] 

    def __setitem__(self, key, value): 
     print("Set element {} to {}".format(key, value)) 
     self._list[key] = value 

    def __delitem__(self, key): 
     print("Deleting element {}".format(key)) 
     del self._list[key] 

    def __len__(self): 
     print("Getting length") 
     return len(self._list) 

    def insert(self, index, item): 
     print("Inserting item {} at {}".format(item, index)) 
     self._list.insert(index, item) 


class Foo(object): 
    def __init__(self, a_list): 
     self.list = PrivateList(a_list) 

然後捉迷藏這樣的:

foo = Foo([1,2,3]) 
print(foo.list) 
print(foo.list[1]) 
foo.list[1] = 12 
print(foo.list) 

輸出:

[1, 2, 3] 
Accessed element 1 
2 
Set element 1 to 12 
[1, 12, 3] 
+0

所以我*需要一個新的類和重寫'[]'操作符。現在這很有道理。謝謝! ^^ –

+0

是的,你的代碼只檢查是否可以訪問'list'屬性,而不是對該屬性返回的對象的任何操作。 – ojii

1

您的代碼中存在一些問題。他們可能不是唯一的問題,但修復他們會帶給你更多的:

  • 屬性是新的風格類。他們是從object得出:

    class Foo(object):

  • 吸氣劑(以property的第一個參數將被稱爲無參數,所以_get_list不能有第二個參數i這同樣適用於_set_list它只能有。 。一個參數,而不是兩個(self是隱含的,這裏不計。)

+0

非常真實。這就是爲什麼我打電話給我的嘗試「天真」;) –