gpt4 book ai didi

python - 如何编写适配成员类接口(interface)的容器/包装类?

转载 作者:行者123 更新时间:2023-12-05 04:18:57 28 4
gpt4 key购买 nike

我正在编写一个包含另一个类对象的类。目的是改变它的一些方法行为,同时能够扩展它的所有其他接口(interface)。我没有使用继承,因为内部类对象可能会消亡,而外部类需要能够在不破坏自身的情况下用活的对象替换它。

所以我有:

class Inner():
def foo(): pass
def goo(): pass

class Outer():
self.inner = InnerFactory(innerType)
def foo():
try:
self.inner.foo()
except:
del self.inner
self.inner = InnerFactory(innerType)
self.inner.foo()

问题是如何在不显式重写的情况下扩展 goo,因为我可能有很多我不知道的其他此类方法。

实际上,在阅读了下面的一些反馈后,我意识到我没有使用很棒的函数 getattr。但是,我不太明白为什么下面的建议似乎都使用了如此复杂的版本。为什么不能像这样简单:

def __getattr__( self, name ):
if self.inner:
return getattr( self.inner, name )
else:
raise Exception( 'attribute %s not found' % name )

最佳答案

类似下面的代码可以满足您的需求,但是:1) 它很丑陋; 2)它不是线程安全的; 3) 它陷入循环,直到 Inner 中的某个方法引发异常(这不是由于实现而是由于发布的最初想法); 4) 避免使用它的更多原因:)

class Inner:
def foo(self):
print "foo"
def bar(self):
print "bar"

class Outer:
def __init__(self):
self.inner = Inner()

def __getattr__(self, name):
ret = getattr(self.inner, name)
def wrapper(*args):
try:
ret(*args)
except:
del self.inner
self.inner = Inner()
updated = self.__getattr__(name)
updated(*args)

return wrapper

def blah(self):
print "Blah"

outer = Outer()

outer.foo()
outer.bar()
outer.blah()
outer.nosuchattr()

关于python - 如何编写适配成员类接口(interface)的容器/包装类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6110799/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com