2013-05-04 4 views
0
globalList = [] 
class MyList: 
    def __init__(self): 
     self.myList = [1, 2, 3] 

    @property 
    def myList(self): 
     return self.myList.extend(globalList) 
    @myList.setter 
    def myList(self): 
     return self.myList 
mL1 = MyList() 
print("myList: ", mL1.myList) 
mL1.myList.append(4) 
print("after appending a 4, myList: ", mL1.myList) 

моя цель состоит в том, чтобы быть в состоянии назвать mL1.myList, который оценивает MyList атрибут экземпляра и глобальный объект globalList, но вот ошибка:Python свойство сеттер украшение объекта списка

Traceback (most recent call last): 
    File "C:\Documents and Settings\Administrator\Desktop\Dropbox\sandbox.py", line 14, in <module> 
    mL1 = MyList() 
    File "C:\Documents and Settings\Administrator\Desktop\Dropbox\sandbox.py", line 6, in __init__ 
    self.myList = [1, 2, 3] 
TypeError: myList() takes 1 positional argument but 2 were given 

Что я должен сделать, чтобы решить эту проблему?

+3

Я не уверен, что вы пытаетесь сделать, но вы, кажется, неправильно используете свойства. Инициатор свойств (что вы создаете с помощью 'myList.setter') - это то, что вызывается, когда вы делаете' mL1.myList = something'. Он должен принять другой аргумент, который является значением 'something', для которого должно быть установлено свойство. Если вы хотите, чтобы вы могли читать 'mL1.myList', зачем вам нужен сеттер? Что вы хотите, чтобы сеттер сделал? – BrenBarn

ответ

0

У вашего кода есть ряд проблем. Вероятно, самым большим является то, что вы не можете присвоить своей собственности то же имя, что и базовый атрибут, который он читает. Если в вашем myList getter вы делаете self.myList, это вызовет бесконечную рекурсию, потому что для выяснения того, что self.myList, он должен снова вызвать свойство getter.

Чтобы избежать этого, вы должны иметь атрибут getter и setter какого-либо другого атрибута, обычно одно и то же имя, но с символом подчеркивания. То есть для вашего случая используйте атрибут «скрытый» _myList, чтобы сохранить значение, которое свойство получает/устанавливает.

Во-вторых, ваш установщик свойств должен принять аргумент за значение, которое вы хотите установить для свойства, и ему необходимо установить базовый атрибут для этого значения.

Наконец, вы возвращаете результат extend, но extend изменяет список на месте и возвращает None, так что ваш код будет приводить к None как значение mL1.myList.

Ваш код должен выглядеть следующим образом:

globalList = [] 
class MyList(object): 
    def __init__(self): 
     self.myList = [1, 2, 3] 

    @property 
    def myList(self): 
     return self._myList + globalList 
    @myList.setter 
    def myList(self, val): 
     self._myList = val 

Если вы используете Python 3, как это кажется вам, то вы можете просто сделать class MyList: вместо class MyList(object):.

+0

Убрать несколько недоразумений, которые у меня были! Спасибо. – user14042