2017-03-04 95 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)