2011-05-11 96 views
2

我希望能够用Python包装任何对象。以下似乎不可能,你知道为什么吗?什么是包装对象的最佳pythonic方式?

class Wrapper: 
    def wrap(self, obj): 
     self = obj 

a = list() 
b = Wrapper().wrap(a) 
# can't do b.append 

谢谢!

+2

请注意,如果您在Python 2.x中认为它是从对象继承的良好做法 – 2011-05-11 08:33:52

+1

完全有可能,它只是不会做你认为的事情。 :) Python变量不是指针,它们是名字。当你设置'self = obj'时,你只需要说名字“self”现在指向名字“obj”也指向的对象。但名称是本地的,或者整个程序中只能有一个自己,所以它不会改变。这导致我们接下来的评论:当问问题时,总是解释*为什么*你在做你正在做的事情。你似乎不想包装对象,你似乎想要代理它。 – 2011-05-11 08:59:27

+2

为什么“包裹”一个物体? Python中的对象永远不需要包装器,因为它们总是完全相互“兼容”。你能提供一些关于“包装”的含义的背景吗?为什么? – 2011-05-11 10:03:54

回答

5

尝试使用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) 
0

你只是引用变量自身是在包装的某个对象()。当wrap()结束时,该变量被垃圾回收。

你可以简单地保存对象的封装属性来实现你想要什么

1

你也可以做你想做的通过重写新:

class Wrapper(object): 
    def __new__(cls, obj): 
     return obj 
t = Wrapper(list()) 
t.append(5) 
+0

这个问题可能也是有用的:http://stackoverflow.com/questions/1015592/why-is-self-in-python-objects-immutable – Hernan 2011-05-11 08:37:17

+0

用这种方法,你还没有真正包装列表,你只是做了一个无操作的可调用的'Wrapper',它只是返回它传递的任何东西。 't'对象是一个列表对象。 (如果'Wrapper'作为参数传递了一个'Wrapper'子类(比如说覆盖'__new__'以使它再次正常工作),那么它也会在它传递的对象上调用'__init__') – 2011-05-11 08:57:54

1

你正在寻找也许什么,这不你正在寻找的工作,比你想要做的更优雅,是:

Alex MartelliBunch Class

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 

在链接配方页面中有其他可用的实现。

相关问题