2013-08-22 47 views
0

所以我有一個父和子類:可以通過子實例訪問動態父實例的屬性和屬性值嗎?

class Map(object): 
    def __init__(self, name=''): 
     self.mapName = name 
     self.rules = {} 

class Rule(Map): 
    def __init__(self, number): 
     Map.__init__(self) 
     self.number = number 

    def __repr__(self): 
     return "Map " + self.mapName + " rule number " + str(self.number) 

if __name__ == "__main__": 
    map = Map("thismap") 
    rule = Rule(1) 
    map.rules[rule.number] = rule 

上述:

$ python -i inherit.py 
>>> map 
<__main__.Map object at 0xb7e889ec> 
>>> map.rules 
{1: Map rule number 1} 
>>> map.rules[1] 
Map rule number 1 
>>> 

我曾嘗試加入:

map.rules[2] = Rule(2) 

但仍然得到:

$ python -i inherit.py 
>>> map.rules 
{1: Map rule number 1, 2: Map rule number 2} 
>>> 

和:

map.rule = Rule(3) 

這也並沒有真正讓我什麼我在尋找:

>>> map.rules 
{1: Map rule number 1, 2: Map rule number 2} 
>>> map.rule 
Map rule number 3 
>>> 

我試圖做的是一個子實例鏈接到父實例類和訪問動態父類的屬性和值,在這種情況下這將是方便的,因爲我想用規則列表填充地圖並打印規則,包括每個規則的父映射名稱。我只是不確定我會如何去做這個在Python中。或者我只是試圖以一種並不意味着被使用的方式來使用繼承,或者遺漏一些顯而易見的東西。

任何想法都歡迎,並提前致謝

+0

'self.mapName'不是由您的子類的構造函數設置的,所以它具有默認值,即空字符串。 – dastrobu

回答

0

你濫用繼承。規則不需要繼承Map以訪問Map的屬性,並且將規則附加到Map不會使其看到Map的屬性值。從地圖繼承意味着規則 a地圖,而不是它與地圖鏈接或管理。

如果你想有一個規則,以瞭解它的地圖,把它記錄哪些地圖與相關聯:

class Rule(object): 
    def __init__(self, number, map): 
     super(Rule, self).__init__() 
     self.number = number 
     self.map = map 
    def __str__(self): 
     # __str__, not __repr__, because __repr__ should be unambiguous, 
     # have a clear beginning and ending, and obviously indicate the type. 
     return "Map {} rule number {}".format(self.map.mapName, self.number) 

Rule(1, map) # makes a rule associated with map 

你可能會想摺疊生成規則,並將其添加到地圖到一個操作 - 可能是Map的實例方法。