假设以下模块:
hello.py
class A(object):
_hidden = 987
b = 654
c = 321
现在,假设导入hello
模块时,我们需要以下变量来进行评估:
import hello
hello.A # evaluates to 987
hello.A.b # evaluates to 654
hello.A.c # evaluates to 321
我们可以将任何内容添加到hello.py
模块中(但是必须保留类定义),并且我们无法完全更改测试的语法。您将如何"覆盖" hello.A
返回_hidden
属性的值?
A
是一个自定义类,您可以从中获取更多属性,或者是整数号码。
如果hello.A
是整数987
,您将无法获得987.b
,ordinarilly获得另一个值。
当然,除非A
本身就是int
的专业子类的实例,该实例可以实现额外的b
和c
属性。对于演示目的而言,这是可行的,但是当然是什么解决方案 - 您应该真正发布您的真正问题,而不是您要寻找的道路。
在这种情况下,为了在" _ -hidden"属性中具有值,我建议使用类装饰器,可能会允许您将其作为自定义INT子类的特殊实例:
def converter(cls):
class MyInt(int):
pass
for attr in cls.__dict__:
if not attr.startswith('__'):
setattr(MyInt, attr, cls.__dict__[attr])
return MyInt(cls._hidden)
@converter
class A:
_hidden = 987
b = 654
c = 321
在交互提示中:
In [14]: A
Out[14]: 987
In [15]: A.b
Out[15]: 654
In [16]: A.c
Out[16]: 321
当然,A
不能再用作"类" - 它是整数。
,如果您不能更改此源,并且必须猴子patch hello.py文件:
import hello
def converter(cls):
...
hello.A = converter(hello.A)