覆盖访问类的价值



假设以下模块:

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的专业子类的实例,该实例可以实现额外的bc属性。对于演示目的而言,这是可行的,但是当然是什么解决方案 - 您应该真正发布您的真正问题,而不是您要寻找的道路。

在这种情况下,为了在" _ -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)

最新更新