2010-11-13 177 views
1

我真的不知道應該選擇什麼樣的標題。無論如何,我有這樣的代碼(這是fixtures):從父類中的另一個子類訪問子類

from fixture import DataSet 

class CategoryData(DataSet): 
    class cat1: 
     name = 'Category 1' 
    class cat2: 
     name = 'Category 2' 
     parent = cat1 

問題是我不能引用CAT1在CAT2這樣的:

File "/home/julas/cgp/cgp/datasets/__init__.py", line 11, in cat2 
    parent = cat1 
NameError: name 'cat1' is not defined 

我該怎麼辦呢?

回答

3

這裏有兩個問題。

首先,Python不會爲你做這樣的嵌套範圍。要訪問CategoryData.cat1,您需要拼寫出來。

其次,還有一個更大的問題是,無法從那裏訪問CategoryData:由於您正在定義它,因此該類尚未定義。如果你這樣做:

class Object(object): 
    a = 1 
    b = Object.a 

它會失敗,因爲Object值不分配,直到類定義的結束。你可以把它看作發生這樣的:

class _unnamed_class(object): 
    a = 1 
    b = Object.a 
Object = _unnamed_class 

有沒有辦法引用從那裏b分配a,因爲包含類尚未分配它的名字。

爲了分配parent作爲一個階級屬性,你需要給它分配後的含類確實存在:

class CategoryData(DataSet): 
    class cat1: 
     name = 'Category 1' 
    class cat2: 
     name = 'Category 2' 
CategoryData.cat2.parent = CategoryData.cat1 
+0

我也用夾具,雖然我還沒有遇到這個問題,我已經看到了描述。我相信格倫的答案會做你想做的,但是你會讓你的燈具的定義有點散亂,而且不太可讀。我會好奇的,看看你最終會做什麼。 – Marco 2010-11-13 18:06:26

+0

我知道當我試圖引用這個類時,問題出現在定義沒有完成的時候。我只是沒有想過把它從定義中移出來。我想我會使用它,因爲我沒有看到其他選項。我不知道像YAML這樣的其他格式是否會更好地用於燈具而不是像這樣彎曲Python。 – 2010-11-13 22:39:53

1

您: 將它的定義:

CategoryData.cat2.parent=CategoryData.cat1 

或者,如果它是一個對象的屬性(而不是類屬性):

class cat2: 
    name = 'Category 2' 
    def __init__(self): 
     self.parent = cat1