我希望能夠在具有子節點和孫子節點的節點實例上鍊接方法。當我在該頂層節點上調用一個方法時,我希望能夠返回該對象的子孫。我也希望能夠從最頂層的節點獲得這些兒童和孫子的屬性。我有以下數據模型:Python:你如何鏈接方法列表的對象列表?
class GrandParent(object):
def __init__(self,name='',age=0,is_retired=True,children=[]):
self.name = name
self.age = age
self.is_retired = is_retired
if children:
self.children = children
def print_mychildren(self):
for child in self.children:
print "Child: ",child
def mychildren(self):
return self.children
def __str__(self):
return "name: %s age: %s is_retired:%s" %(self.name,self.age,self.is_retired)
class Parent(object):
def __init__(self,name='',age=0,has_mortgage=True,children=[]):
self.name = name
self.age = age
self.has_mortgage = has_mortgage
if children:
self.children = children
def print_mychildren(self):
for child in self.children:
print "Child: ",child
def __str__(self):
return "name: %s age: %s has_mortgage: %s" %(self.name,self.age,self.has_mortgage)
class Child(object):
def __init__(self,name='',age=0,has_toys=True):
self.name = name
self.age = age
self.has_toys = has_toys
def __str__(self):
return "name: %s age: %s has_toys:%s" %(self.name,self.age,self.has_toys)
if __name__ == '__main__':
beaver = Child('Beaver',12,True)
ward = Child('Ward',16,False)
june = Parent('June',38,True,[beaver,ward])
grandpa = GrandParent('Grandpa',61,True,[june])
print grandpa
grandpa.print_mychildren() # print June
# Doesn't work
grandpa.mychildren().print_mychildren() # I want it to print Ward and Beaver
# Doesn't work
print grandpa.mychildren().mychild('Beaver').age # I want it to return an age
請注意,我想保持祖父母,父母,和子類分開,因爲我想給不同的屬性,每個類如has_mortgage或is_retired。
從上面的數據模型中,我希望能夠鏈接方法以遍歷頂層節點的子節點。它應該是這樣的:
grandpa.children # returns a list of children
print grandpa.mychild('June').has_mortgage # returns the value
grandpa.mychildren().mychildren() # prints a list of grandchildren
print grandpa.mychildren().mychild('Ward').has_toys # return the value
換句話說,我可以聲明:
print grandpa.mychildren().mychildren()
的行爲,如:
for child in grandpa.children:
for grandchild in child.children:
print grandchild
我會非常感謝您的回答了這一點。謝謝。
保羅
芝加哥,伊利諾伊
在我看來,這是繼承的用例。您應該爲每個班級採用所有常見的屬性/方法,並將它們分組到一個班級中。然後,從你的每個子類('祖父母','父母'和'孩子')繼承那個類。 –
我投票結束這個問題爲「本地化」,但我的建議是結合'myChild'和'myChildren'方法。 'def myChildren(name = None):'例如。傳遞一個論證意味着你正在調用該方法的目的。 –
你是什麼意思「太本地化」。我同意,子類化將有助於清理代碼,但無助於解決所描述的問題。 – schacki