假设有以下模块:
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
属性?
答案 0 :(得分:0)
A
是一个自定义类,您可以从中获取更多属性,或者它是一个整数。
如果hello.A
是整数987
,则无法获得987.b
,通常会获得另一个值。
当然,除非A
本身是int
的专用子类的实例,它实现了额外的b
和c
属性。这对于演示目的是可行的,但当然是无解的解决方案 - 你应该真正发布你真正的问题,而不是你正在寻找的路径。
在这种情况下,为了获得“_hidden”属性中的值,我建议使用一个类装饰器,它可能允许你将A作为自定义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
不能再作为“阶级”工作 - 它是一个整合者。
如果您无法更改此源,并且必须对hello.py文件进行猴子补丁:
import hello
def converter(cls):
...
hello.A = converter(hello.A)