如何在 python 中扩展内置类?我想向 str 类添加一个方法。
我做了一些搜索,但我发现的只是旧帖子,我希望有人知道更新的东西。
Unkwntech
问问题
23686 次
3 回答
36
只是子类化类型
>>> class X(str):
... def my_method(self):
... return int(self)
...
>>> s = X("Hi Mom")
>>> s.lower()
'hi mom'
>>> s.my_method()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in my_method
ValueError: invalid literal for int() with base 10: 'Hi Mom'
>>> z = X("271828")
>>> z.lower()
'271828'
>>> z.my_method()
271828
于 2008-12-09T12:08:35.257 回答
15
一种方法是使用“类重新打开”概念(原生存在于 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
于 2015-10-09T08:37:13.147 回答
6
假设您不能更改内置类。在 Python3 中模拟像 Ruby 这样的“类重新打开”,其中__dict__
是 mappingproxy 对象而不是 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
在 Python2 中,我还可以编写一个装饰器函数“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
于 2016-09-26T17:39:31.107 回答