Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
[e-max@e-max pypy]$ ./pypy-c
Python 2.7.2 (e4568fc96f21+, Apr 11 2012, 07:59:26)
[PyPy 1.8.1-dev0 with GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``pypy is like sausages''
>>>> str.len = property(lambda self: len(self))
Traceback (most recent call last):
File "", line 1, in TypeError: can't set attributes on type object 'str'
matchesRegex:, matchesRegexIgnoringCase: и другие.class a(dict):
def count(self):
return len(self)
aa = a()
aa // {}
aa[1] = 1
aa[2] = 2
aa.count() // 2
«если мы захотим заставить свой класс «крякать» как список или словарь, нам, видимо, тоже нужно будет реализовать метод length» — логично, и в этом нет ничего плохого. Сейчас вы реализуете метод __len__.
«иметь свойство length у своего объекта часто будет ошибкой, т.к. объект начнет «крякать» как список» — с чего это он станет крякать именно как список от наличия метода length? чем тогда уж хэш или строка хуже?
Наличия метода length означает только лишь то, что у объекта есть некоторая «длина». И если кто-то на основе факта наличия длины делает вывод о том, что это список — то это не проблема языка. Ту же логику этот странный человек может применить и к методу __len__.
По-моему, уродства тут нет
next(my_iterator) — в них немного меньше от ООП, немного больше от ФП
для реализации какого-то питоньего протокола
он начнет в отношении длины крякать как список, словарь или строка и любой другой объект, имеющий длину
Но вывод-то делает не «странный человек», читающий код, а интерпретатор питона.
if( undefined === [].indexOf )
{
Array.prototype.ondexOf = function(){...}
}
if( undefined === Array.isArray )
{
Array.isArray = function(){...}
}
Python 3.2.2 (default, Sep 4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import typehack
>>> list.join = lambda x,s:s.join(x)
>>> ["123","456","7890"].join('-')
'123-456-7890'
Как добавить динамизма в Python 2.7?