Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 29, 2017 00:57:50

Koala
Зарегистрирован: 2015-10-28
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

можно ли переопределить append в списке?

вот есть переопределение операторов, __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']

Отредактировано Koala (Янв. 29, 2017 01:02:17)

Офлайн

#2 Янв. 29, 2017 05:10:00

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

можно ли переопределить append в списке?

Искомое переопределение лучше все реализовывать путем наследования:

 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)… Так что с такими операциями нужно быть очень аккуратным…



Офлайн

#3 Янв. 29, 2017 06:30:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9993
Репутация: +  857  -
Профиль   Отправить e-mail  

можно ли переопределить append в списке?

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)]
>>>



Офлайн

#4 Янв. 29, 2017 12:57:35

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

можно ли переопределить append в списке?

Рекомендуется наследоваться от UserList, в книге Рамальо Лучано - “Python. К вершинам мастерства” есть оч показательный пример почему это так



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version