2009-04-10 59 views
1

訪問對象我正在寫,其中每個變量由一個值和一個描述組成的「envirorment」時:返回默認成員在python

class my_var: 
    def __init__(self, value, description): 
     self.value = value 
     self.description = description 

變量被創建並把辭典內:

my_dict["foo"] = my_var(0.5, "A foo var") 

這很酷,但有99%的變量操作是與「值」成員。所以,我必須這樣寫:

print my_dict["foo"].value + 15 # Prints 15.5 

my_dict["foo"].value = 17 

我想,關於對象my_dict所有操作[「富」]可能默認爲「價值」的成員。換句話說,我想寫:

print my_dict["foo"] + 15  # Prints 5.5 

和類似的東西。

我發現的唯一方法是重新實現全部下劃線成員(eq,add,str等),但我覺得這是錯誤的方式。有一種我可以使用的神奇方法嗎?

一種解決方法是將有更多的字典,像這樣:

my_dict_value["foo"] = 0.5 
my_dict_description["foo"] = "A foo var" 

,但我不喜歡這樣的解決方案。你有什麼建議嗎?

回答

2

我個人只會使用兩個字典,一個用於數值,一個用於描述。您對神奇行爲的渴望並不是非常的Pythonic。

有了這樣說,你可以實現自己的字典類:如果你決定去魔術行爲路線,那麼這應該

my_dict = DescDict() 
my_dict["foo"] = (0.5, "A foo var") # just use a tuple if you only have 2 vals 
print my_dict["foo"] + 15   # prints 15.5 
print my_dict.get_desc("foo")  # prints 'A foo var' 

class DescDict(dict): 
    def __init__(self, *args, **kwargs): 
     self.descs = {} 
     dict.__init__(self) 

    def __getitem__(self, name): 
     return dict.__getitem__(self, name) 

    def __setitem__(self, name, tup): 
     value, description = tup 
     self.descs[name] = description 
     dict.__setitem__(self, name, value) 

    def get_desc(self, name): 
     return self.descs[name] 

你會使用這個類,如下所示是一個很好的起點。

1

我認爲,你必須做很多工作才能製作出一個奇特的快捷方式,這表明你對穀物不利。你在做什麼違反了LSP;這是違反直覺的。

my_dict[k] = v; 
print my_dict[k] == v # should be True 

即使是兩個單獨的字典也會優於改變字典的含義。

3

兩個一般說明。

  1. 請使用大寫字母作爲班級名稱。

  2. 請(除非使用Python 3.0)子類對象。例如,class My_Var(object):

現在你的問題。

比方說,你做

x= My_Var(0.5, "A foo var") 

如何蟒蛇x區分,複合對象和X的值(x.value)?

你想要以下行爲嗎?

  • 有時候x表示整個組合對象。

  • 有時x表示x.value

你如何區分兩者?你如何告訴Python你的意思是?

2

您可以創建一個主要的作用類似於「價值」,但有一個附加屬性「的描述,通過實施部分運營商‘畫圓數字類型’的http://docs.python.org/reference/datamodel.html

class Fooness(object): 
    def __init__(self,val, description): 
     self._val = val 
     self.description = description 

    def __add__(self,other): 
     return self._val + other 

    def __sub__(self,other): 
     return self._val - other 

    def __mul__(self,other): 
     return self._val * other 

    # etc 

    def __str__(self): 
     return str(self._val) 


f = Fooness(10,"my f'd up fooness") 
b = f + 10 
print 'b=',b 
d = f - 7 
print 'd=',d 

print 'f.description=',f.description 

對象主要生產:

b= 20 
d= 3 
f.description= my f'd up fooness