是否可以将扩展方法添加到python内置类型中?我知道我可以通过简单地通过添加新方法来将扩展方法添加到定义的类型。如下:
class myClass:
pass
myClass.myExtensionMethod = lambda self,x:x * 2
z = myClass()
print z.myExtensionMethod(10)
但是是将扩展方法添加到python内置类型(如列表,字典,…)的任何方法
list.myExtension = lambda self,x:x * 2
list.myExtension(10)
可以使用以下非常聪明的模块在纯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().
E.g:
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
在那里,感觉不舒服吗?
本文向大家介绍Python实现扩展内置类型的方法分析,包括了Python实现扩展内置类型的方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现扩展内置类型的方法。分享给大家供大家参考,具体如下: 简介 除了实现新的类型的对象方式外,有时我们也可以通过扩展Python内置类型,从而支持其它类型的数据结构,比如为列表增加队列的插入和删除的方法。本文针对此问题,结合实现集合功
问题内容: 我试图在这样的泛型类中创建一个常规的RuntimeException: 这段代码使我对这个词的错误说法。 这个RuntimeException与我的类通用有什么关系? 问题答案: Java不允许Throwable的通用子类。而且,非静态内部类可以通过其外部类的类型参数有效地进行参数化(请参见Oracle JDK Bug 5086027 )。例如,在您的示例中,内部类的实例具有form类
内建的类,例如 Array,Map 等也都是可以扩展的(extendable)。 例如,这里有一个继承自原生 Array 的类 PowerArray: // 给 PowerArray 新增了一个方法(可以增加更多) class PowerArray extends Array { isEmpty() { return this.length === 0; } } let arr
① python中yield关键字的使用: yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器 当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象 当你使用for进行迭代的时候,函数中的代码才会执行 生成器特点:可迭代;只能读取一次;实时生成数据,不全存在内存中。 def fun(): yield "aaa" yield
Extending built-in models(扩展内置 model) 使用JSON 扩展 使用 js 扩展 Model 定义 使用 mixin 建立自定义模型 使用JSON扩展模型 使用 模型生成器 创建一个 Model, 你需要选择一个 model 然后继承它,你的模型会继承 它,以及获得他的方法和属性. 案例,扩展了 PersistedModel: /common/models/mode
问题 你想要扩展一个类来增加新的函数或者替换旧的。 解决方案 使用 :: 把你的新函数分配到对象或者类的原型中。 String::capitalize = () -> (this.split(/\s+/).map (word) -> word[0].toUpperCase() + word[1..-1].toLowerCase()).join ' ' "foo bar baz".ca