Форум сайта python.su
вот есть переопределение операторов, __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'
>>> 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)
Офлайн
Искомое переопределение лучше все реализовывать путем наследования:
class MyList(list): pass # do something ....
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'
>>> curse(list, 'append','Overriden!') >>> x [1, 2, 3] >>> x.append 'Overriden!'
Офлайн
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)] >>>
Офлайн
Рекомендуется наследоваться от UserList, в книге Рамальо Лучано - “Python. К вершинам мастерства” есть оч показательный пример почему это так
Офлайн