jed*_*mao 62 python monkeypatching custom-attributes built-in-types
例如 - 假设我想helloWorld()
为Python的dict类型添加一个方法.我可以这样做吗?
JavaScript有一个行为方式的原型对象.也许这是糟糕的设计,我应该继承dict对象,但它只适用于子类,我希望它可以在任何和所有未来的字典上工作.
以下是它在JavaScript中的表现:
String.prototype.hello = function() {
alert("Hello, " + this + "!");
}
"Jed".hello() //alerts "Hello, Jed!"
Run Code Online (Sandbox Code Playgroud)
这是一个有用的链接,包含更多示例 - http://www.javascriptkit.com/javatutors/proto3.shtml
Try*_*yPy 66
您无法直接将方法添加到原始类型.但是,您可以对类型进行子类化,然后将其替换为内置/全局命名空间,从而实现所需的大部分效果.不幸的是,由文字语法创建的对象将继续属于vanilla类型,并且不会有新的方法/属性.
这是它的样子
# Built-in namespace
import __builtin__
# Extended subclass
class mystr(str):
def first_last(self):
if self:
return self[0] + self[-1]
else:
return ''
# Substitute the original str with the subclass on the built-in namespace
__builtin__.str = mystr
print str(1234).first_last()
print str(0).first_last()
print str('').first_last()
print '0'.first_last()
output = """
14
00
Traceback (most recent call last):
File "strp.py", line 16, in <module>
print '0'.first_last()
AttributeError: 'str' object has no attribute 'first_last'
"""
Run Code Online (Sandbox Code Playgroud)
小智 9
确实是的,但是您必须定义一个相同类型的新类,并且它应该继承自该类型。
例如:
class list(list):
def __init__(self, *args):
super().__init__(args)
def map(self, function):
return [function(i) for i in self]
a = list(1, 2, 3, 4, 5)
def double(i):
return i * 2
print(a.map(double))
Run Code Online (Sandbox Code Playgroud)
刚试过禁果!
这是代码,非常简单!
from forbiddenfruit import curse
def list_size(self):
return len(self)
def string_hello(self):
print("Hello, {}".format(self))
if __name__ == "__main__":
curse(list, "size", list_size)
a = [1, 2, 3]
print(a.size())
curse(str, "hello", string_hello)
"Jesse".hello()
Run Code Online (Sandbox Code Playgroud)
注意:此 QA 被标记为与此重复,但 IMO 它要求不同的东西。我无法在那里回答,所以我在这里回答。
具体来说,我想继承str
并添加自定义属性。现有的答案(尤其是那些说你不能的答案)并没有完全解决这个问题,但这对我有用:
class TaggedString(str):
"""
A ``str`` with a ``.tags`` set and ``.kwtags`` dict of tags.
Usage example::
ts = TaggedString("hello world!", "greeting", "cliche",
what_am_i="h4cker")
(ts.upper(), ts.tags, ts.kwtags)
"""
def __new__(cls, *args, **kwargs):
return super().__new__(cls, args[0])
def __init__(self, s, *tags, **kwtags):
super().__init__()
self.tags = set(tags)
self.kwtags = kwtags
Run Code Online (Sandbox Code Playgroud)
希望这对某人有帮助!干杯,
安德烈斯
归档时间: |
|
查看次数: |
23181 次 |
最近记录: |