Расширение встроенных классов в python

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

3 Solutions collect form web for “Расширение встроенных классов в python”

Просто подкласс типа

>>> class X(str): ... def myMethod( self ): ... return int(self) ... >>> s=X("Hi Mom") >>> s.lower() 'hi mom' >>> s.myMethod() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in myMethod ValueError: invalid literal for int() with base 10: 'Hi Mom' >>> z=X("271828") >>> z.lower() '271828' >>> z.myMethod() 271828 

Один из способов может заключаться в использовании концепции «повторного открытия класса» (изначально существующей в Ruby), которая может быть реализована на Python с использованием декоратора класса. Пример приведен на этой странице: http://www.ianbicking.org/blog/2007/08/opening-python-classes.html

Я цитирую:

Я думаю, что с декораторами класса вы могли бы это сделать:

 @extend(SomeClassThatAlreadyExists) class SomeClassThatAlreadyExists: def some_method(self, blahblahblah): stuff 

Реализовано следующим образом:

 def extend(class_to_extend): def decorator(extending_class): class_to_extend.__dict__.update(extending_class.__dict__) return class_to_extend return decorator 

Предполагая, что вы не можете изменять встроенные классы. Для имитации «повторного открытия класса», такого как Ruby in Python3, где __dict__ – объект __dict__ а не объект dict:

 def open(cls): def update(extension): for k,v in extension.__dict__.items(): if k != '__dict__': setattr(cls,k,v) return cls return update class A(object): def hello(self): print('Hello!') A().hello() #=> Hello! #reopen class A @open(A) class A(object): def hello(self): print('New hello!') def bye(self): print('Bye bye') A().hello() #=> New hello! A().bye() #=> Bye bye 

Я мог бы также написать функцию декоратора «open»:

 def open(cls): def update(extension): namespace = dict(cls.__dict__) namespace.update(dict(extension.__dict__)) return type(cls.__name__,cls.__bases__,namespace) return update 
  • ValueError: неверный литерал для int () с базой 16: '\ x0e \ xa3' Python
  • Преобразование шестнадцатеричной строки в int в Python
  • Почему «new_file + = строка + строка» намного быстрее, чем «new_file = new_file + line + string»?
  • В чем разница между кодированием / декодированием?
  • string.decode () против unicode (строка)
  • строки на иврите в python для s60
  • Установка параметра fmt в numpy.savetxt
  • Список юникодов печати Python
  • Вырезать внутри шаблона с использованием регулярного выражения Python
  • Разделить строку на пробелы в Python
  • используя Python для генерации строкового литерала C JSON
  • Python - лучший язык программирования в мире.