2010-09-03 82 views
0

(全部在ActivePython 3.1.2)python:操縱類的__dict__

我試圖改變類(而不是實例)的屬性。元類的__dict__看起來像是一個完美的解決方案。但當我試圖修改時,我得到:

TypeError: 'dict_proxy' object does not support item assignment

爲什麼,我該怎麼辦呢?

編輯

我加入的類定義中的屬性。

setattr不起作用,因爲該類尚未構建,因此我現在還無法引用它(或者至少我不知道如何)。

傳統的賦值不起作用,因爲我添加了大量的屬性,其名稱由特定規則確定(所以我不能只輸入它們)。

換句話說,假設我想class A有屬性A.a001A.a999;並且它們都必須在完全構建之前進行定義(否則SQLAlchemy將無法正確使用它)。

請注意,我在原始標題中輸入了一個錯字:它是我想修改的普通類的__dict__,而不是元類。

+0

在那種情況下,您是如何訪問__dict__的? – 2010-09-03 17:53:28

+0

它允許我訪問它,而不是修改 – max 2010-09-03 23:41:13

回答

3

創建大量的屬性遵循某些規則的味道,如某事是嚴重錯誤的。我會回去看看是否有更好的方式來做到這一點。

已經在這裏有說是「邪惡的代碼」(但它會工作,我認爲)

class A: 
    locals()['alpha'] = 1 

print A.alpha 

這工作,因爲當類被定義有跟蹤的局部變量你是一本字典definining。這些局部變量最終成爲類屬性。對當地人要小心,因爲它不一定會「正確」行事。你不是真的應該修改當地人,但是當我嘗試它時似乎有效。

+0

我在編輯中更多地解釋了上下文。 – max 2010-09-03 17:44:04

+0

嚇人。我想我可以做到,但它看起來像一個黑客。沒有我能做到的事情嗎?順便說一句,這些屬性並不多;它們只是在我解析輸入時動態創建的。我想也許是什麼讓這個混亂是從SQLAlchemy的聲明語法 – max 2010-09-03 23:28:49

+0

我接受這個答案,因爲這是在我的條件下最好...我同意,但我會消除聲明語法... – max 2010-09-04 18:47:06

0

我不是太熟悉如何對待3字典你可以通過簡單地繼承字典類,像這樣能夠繞過這個問題:

class A(dict): 
def __init__(self,dict_of_args): 
    self['key'] = 'myvalue' 
    self.update(dict_of_args) 
    # whatever else you need to do goes here... 

A()可以像這樣被引用:

d = {1:2,3:4} 
obj = A(mydict) 
print obj['test'],obj[3] # this will print myvalue and 4 

希望這會有所幫助。

+0

它會工作如果我不必遵循需要使用類屬性的SQLAlchemy規範。 – max 2010-09-03 23:23:51

1

而不是使用聲明性語法,分別建立表,然後使用映射器。請參閱http://www.sqlalchemy.org/docs/05/ormtutorial.html#我認爲在定義它時,沒有什麼好方法可以將計算屬性添加到類中。

另外,我不知道這是否會工作,但:

class A(object): 
    pass 
A.all_my_attributes = values 

class B(declarative_base, A): 
    pass 

有可能會工作。