Метод расширения для встроенных типов python!

можно ли добавить метод расширения к встроенным типам python? Я знаю, что я могу добавить метод расширения к определенному типу, просто добавив новый метод. следующим образом:

class myClass: pass myClass.myExtensionMethod = lambda self,x:x * 2 z = myClass() print z.myExtensionMethod(10) 

Но каким-либо образом можно добавить метод расширения в типы python builtin, такие как list, dict, …

 list.myExtension = lambda self,x:x * 2 list.myExtension(10) 

  • Где найти стандартный код библиотеки python?
  • Комментируйте блок кода Python
  • Доступ к переменным уровня модуля из функции в модуле
  • переменная длина% s с оператором% в python
  • Глобальная интеграция приложений SAPE с Babel
  • Механизм не работает для автоматизации входа в Gmail в Google Appengine
  • Как удалить объект, включая всех детей
  • почему list.append return None?
  • 5 Solutions collect form web for “Метод расширения для встроенных типов python!”

    Это можно сделать в чистом Python с помощью этого невероятно умного модуля:

    https://pypi.python.org/pypi/forbiddenfruit

    Например:

     import functools import ctypes import __builtin__ import operator class PyObject(ctypes.Structure): pass Py_ssize_t = hasattr(ctypes.pythonapi, 'Py_InitModule4_64') and ctypes.c_int64 or ctypes.c_int PyObject._fields_ = [ ('ob_refcnt', Py_ssize_t), ('ob_type', ctypes.POINTER(PyObject)), ] class SlotsPointer(PyObject): _fields_ = [('dict', ctypes.POINTER(PyObject))] def proxy_builtin(klass): name = klass.__name__ slots = getattr(klass, '__dict__', name) pointer = SlotsPointer.from_address(id(slots)) namespace = {} ctypes.pythonapi.PyDict_SetItem( ctypes.py_object(namespace), ctypes.py_object(name), pointer.dict, ) return namespace[name] def die(message, cls=Exception): """ Raise an exception, allows you to use logical shortcut operators to test for object existence succinctly. User.by_name('username') or die('Failed to find user') """ raise cls(message) def unguido(self, key): """ Attempt to find methods which should really exist on the object instance. """ return functools.partial((getattr(__builtin__, key, None) if hasattr(__builtin__, key) else getattr(operator, key, None)) or die(key, KeyError), self) class mapper(object): def __init__(self, iterator, key): self.iterator = iterator self.key = key self.fn = lambda o: getattr(o, key) def __getattribute__(self, key): if key in ('iterator', 'fn', 'key'): return object.__getattribute__(self, key) return mapper(self, key) def __call__(self, *args, **kwargs): self.fn = lambda o: (getattr(o, self.key, None) or unguido(o, self.key))(*args, **kwargs) return self def __iter__(self): for value in self.iterator: yield self.fn(value) class foreach(object): """ Creates an output iterator which will apply any functions called on it to every element in the input iterator. A kind of chainable version of filter(). Eg: foreach([1, 2, 3]).__add__(2).__str__().replace('3', 'a').upper() is equivalent to: (str(o + 2).replace('3', 'a').upper() for o in iterator) Obviously this is not 'Pythonic'. """ def __init__(self, iterator): self.iterator = iterator def __getattribute__(self, key): if key in ('iterator',): return object.__getattribute__(self, key) return mapper(self.iterator, key) def __iter__(self): for value in self.iterator: yield value proxy_builtin(list)['foreach'] = property(foreach) import string print string.join([1, 2, 3].foreach.add(2).str().add(' cookies').upper(), ', ') >>> 3 COOKIES, 4 COOKIES, 5 COOKIES 

    Там, разве это не хорошо?

    Нет. Типы, определенные в C, не могут быть обезврежены.

    Нет, вам нужен подкласс!

     >>> import string >>> class MyString(str): ... def disemvowel(self): ... return MyString(string.translate(self, None, "aeiou")) ... >>> s = MyString("this is only a test") >>> s.disemvowel() 'ths s nly tst' 

    Или более конкретный для вашего примера

     >>> class MyList(list): ... pass ... >>> MyList.myExtension = lambda self,x:x * 2 >>> l = MyList() >>> l.myExtension(10) 20 

    Нет, потому что я уверен, что все встроенные типы написаны в оптимизированном C и поэтому не могут быть изменены с помощью Python. Когда я пытаюсь, я просто получаю:

     TypeError: can't set attributes of built-in/extension type 'list' 

    Лучшее, что вы можете сделать, похоже, выводит класс из встроенного типа. Например:

     class mylist(list): def myfunc(self, x): self.append(x) test = mylist([1,2,3,4]) test.myfunc(99) 

    (Вы даже можете назвать его «списком», чтобы получить тот же конструктор, если хотите.) Однако вы не можете напрямую модифицировать встроенный тип, например, пример вашего вопроса.

    Python - лучший язык программирования в мире.