2017-03-04 94 views
-4

假设下面的模块的价值:覆盖访问类

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模块添加任何内容(但类定义必须保持不变),并且我们不能更改synta x的测试。您将如何“覆盖”hello.A的值以返回_hidden属性?

+0

'hello.py' - 'A,B,C =范围(3)' ? – TigerhawkT3

+0

在类定义之后插入'A,b,c = A._hidden,A.b,A.c'。但更严重的问题是:你在寻找一个'Enum'吗? – MSeifert

+1

这个问题令人困惑,不是因为很难像书面回答,而是因为像@ TigerhawkT3这样的答案非常直截了当,很难不怀疑它被一些未提及的约束所排除。 – DSM

回答

0

A是可以从中获取更多属性的自定义类,也可以是整数。

如果hello.A是整数987你不能得到987.b,通常得到另一个值。

除非,当然,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可以不再工作作为一个 “类” - 这是一个integger。

如果你不能改变这个源,并且具有向猴子修补hello.py文件:

import hello 

def converter(cls): 
    ... 

hello.A = converter(hello.A)