我希望能够用Python包装任何对象。以下似乎不可能,你知道为什么吗?什么是包装对象的最佳pythonic方式?
class Wrapper:
def wrap(self, obj):
self = obj
a = list()
b = Wrapper().wrap(a)
# can't do b.append
谢谢!
我希望能够用Python包装任何对象。以下似乎不可能,你知道为什么吗?什么是包装对象的最佳pythonic方式?
class Wrapper:
def wrap(self, obj):
self = obj
a = list()
b = Wrapper().wrap(a)
# can't do b.append
谢谢!
尝试使用GETATTR蟒魔力:
class Wrapper:
def wrap(self, obj):
self.obj = obj
def __getattr__(self, name):
return getattr(self.obj, name)
a = list()
b = Wrapper()
b.wrap(a)
b.append(10)
你只是引用变量自身是在包装的某个对象()。当wrap()结束时,该变量被垃圾回收。
你可以简单地保存对象的封装属性来实现你想要什么
你也可以做你想做的通过重写新:
class Wrapper(object):
def __new__(cls, obj):
return obj
t = Wrapper(list())
t.append(5)
这个问题可能也是有用的:http://stackoverflow.com/questions/1015592/why-is-self-in-python-objects-immutable – Hernan 2011-05-11 08:37:17
用这种方法,你还没有真正包装列表,你只是做了一个无操作的可调用的'Wrapper',它只是返回它传递的任何东西。 't'对象是一个列表对象。 (如果'Wrapper'作为参数传递了一个'Wrapper'子类(比如说覆盖'__new__'以使它再次正常工作),那么它也会在它传递的对象上调用'__init__') – 2011-05-11 08:57:54
你正在寻找也许什么,这不你正在寻找的工作,比你想要做的更优雅,是:
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
# that's it! Now, you can create a Bunch
# whenever you want to group a few variables:
point = Bunch(datum=y, squared=y*y, coord=x)
# and of course you can read/write the named
# attributes you just created, add others, del
# some of them, etc, etc:
if point.squared > threshold:
point.isok = 1
在链接配方页面中有其他可用的实现。
请注意,如果您在Python 2.x中认为它是从对象继承的良好做法 – 2011-05-11 08:33:52
完全有可能,它只是不会做你认为的事情。 :) Python变量不是指针,它们是名字。当你设置'self = obj'时,你只需要说名字“self”现在指向名字“obj”也指向的对象。但名称是本地的,或者整个程序中只能有一个自己,所以它不会改变。这导致我们接下来的评论:当问问题时,总是解释*为什么*你在做你正在做的事情。你似乎不想包装对象,你似乎想要代理它。 – 2011-05-11 08:59:27
为什么“包裹”一个物体? Python中的对象永远不需要包装器,因为它们总是完全相互“兼容”。你能提供一些关于“包装”的含义的背景吗?为什么? – 2011-05-11 10:03:54