Найти - Пользователи
Полная версия: можно ли переопределить append в списке?
Начало » Python для новичков » можно ли переопределить append в списке?
1
Koala
вот есть переопределение операторов, __add__ например.
А можно ли как-то переопределить, например append в list
append это же уже не оператор, да?

пытаюсь тупо переопределить append, или просто прикрутить атрибут ‘zz’ - не получается.
стало быть и ‘append’ так не получится.
возможно ли все-таки переопределить ‘append’,
и как определить, кто из атрибутов объекта ‘read-only’?
Выходит, все-таки приватные методы объекта в python-е существуют?
Точнее - публичные, но “приватные внутри”
“на лицо ужасные - добрые внутри” :-)

 >>> b = [3,4,5]
>>> b.append = 456
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object attribute 'append' is read-only
>>> setattr(b, 'zz', 5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'zz'
>>> b.__setattr__('zz', 5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'zz'
Вообще - что за безобразие, в объекте есть секретный метод __setattr__, и зачем?!!! если он мне тут не может сделать ни ‘set’ ни ‘attr’ :-)

 >>> dir(b)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__'
, '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__'
, '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__'
, '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_e
x__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__s
izeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'ex
tend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
scidam
Искомое переопределение лучше все реализовывать путем наследования:

 class MyList(list):
       pass #  do something ....

А вообще, если по существу, то сделать то, что вы хотите, средствами Python можно, но только это не совсем просто. Тому подтверждение – модуль forbiddenfruit, который позволяет переопределить методы у builtin типов.

После установки forbiddenfruit (pip install forbiddenfruit) можно сделать так:

 Python 3.5.1 (default, Nov 21 2016, 20:51:05) 
[GCC 4.8.5] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from forbiddenfruit import curse,reverse
>>> reverse(list, 'append')
>>> x=[1,2,3]
>>> x.append(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'append'

А также переопределить append:
 >>> curse(list, 'append','Overriden!')
>>> x
[1, 2, 3]
>>> x.append
'Overriden!'

Такие действия, однако, могут вызвать кучу всяких казусов – например, после удаления append из list (посредством reverse из forebiddenfruit) не будет работать даже help(list)… Так что с такими операциями нужно быть очень аккуратным…



py.user.next
Koala
вот есть переопределение операторов, __add__ например.
А можно ли как-то переопределить, например append в list
Надо отнаследовать от него и в производном классе уже переопределять что надо.
  
>>> class List(list):
...     def append(self, item):
...         super().append((item, item))
... 
>>> lst = List([1, 2, 3])
>>> 
>>> lst
[1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, (4, 4)]
>>>
JOHN_16
Рекомендуется наследоваться от UserList, в книге Рамальо Лучано - “Python. К вершинам мастерства” есть оч показательный пример почему это так
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB