覆盖访问类的价值

时间:2017-03-04 23:40:43

标签: python class module

假设有以下模块:

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属性?

1 个答案:

答案 0 :(得分:0)

A是一个自定义类,您可以从中获取更多属性,或者它是一个整数。

如果hello.A是整数987,则无法获得987.b,通常会获得另一个值。

当然,除非A本身是int的专用子类的实例,它实现了额外的bc属性。这对于演示目的是可行的,但当然是无解的解决方案 - 你应该真正发布你真正的问题,而不是你正在寻找的路径。

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