覆盖使用的类
问题描述:
假设有使用一些其他类LesserClass
在一个地方一类NiceClass
我不能编辑覆盖使用的类
# NiceClass.py
class LesserClass:
...
# stuff
...
class NiceClass:
...
# Lots of use of lesser class in here...
...
现在我想用我自己的类MyLesserClass
,而不是到处LesserClass
在的NiceClass
# MyNiceClass.py
from NiceClass import NiceClass
from NiceClass import LesserClass as oldLesserClass
class LesserClass(oldLesserClass):
...
# Some extra stuff
...
class MyNiceClass(NiceClass):
...
# Everywhere LesserClass was used I now want to use MyLesserClass
...
但所有的MyNiceClass
非覆盖的方法继承的版本将使用LesserClass
从旧NiceClass.py
。
如果我只是将NiceClass
的整个定义复制粘贴到MyNiceClass.py
中,那么所有内容都可以正常工作。
这就像我只想继承源代码而不是整个命名空间。也许继承是错误的方式?
答
我希望这仅限于使用类LesserClass
的NiceClass
下的方法。
现在如果你想里面MyNiceClass
方法使用MyLesserClass
而不是LesserClass
那么你可以更新__globals__
字典的这些方法,使名称'LesserClass'
点MyLesserClass
。
这里有一个简单的例子,通过重写__getattribute__
展示相同:
class A:
a = 'A.a'
b = 'A.b'
class B:
def func_a(self):
print(A.a)
def func_b(self):
print(A.b)
class C:
a = 'C.a'
b = 'C.b'
class D(B):
def func_a(self):
print(C.a)
def __getattribute__(self, attr):
value = object.__getattribute__(self, attr)
if callable(value):
value = update_namespace(value, {'old': {'name': 'A', 'obj': A}, 'new': {'obj': C}})
return value
def update_namespace(func, namespace):
def wrapper(*args, **kwargs):
# Update the globals
func.__globals__[namespace['old']['name']] = namespace['new']['obj']
val = func(*args, **kwargs)
# Restore it back to the actual value
func.__globals__[namespace['old']['name']] = namespace['old']['obj']
return val
return wrapper
d = D()
d.func_a() # This should print C.a
d.func_b() # This should print C.b
输出:
C.a
C.b
你的问题,目前尚不得而知。请尽量提供更多清晰度。你的期望和问题是什么? –