initialTreeCom=['ADD_CHILD None King_Shan Male','ADD_CHILD None Queen_Anga Female',
'AM King_Shan Queen_Anga','ADD_CHILD Queen_Anga Chit Male']
famTree=familyTree.FamiltyTree(initialTreeCom)
result=famTree.excommand('GET_RELATIONSHIP Chit Father')
print(result)
Q1. when i create an object of class FamilyTree which inherits from class Relationships . how is a function called excommand of class FamilyTree able to call a function of parent class as
getattr(self, argument[2].replace('-','_'))(argument[1])
but throws an error when i get the function reference by gettr function by using super (since i want to access function of parent class) instead of self?
Q2. How is the called function Father of super class Relationships able to access variable familyMembers of subclass FamilyTree using self.familyMembers ?
class Person():
def __init__(self,mother,name,gender):
self.name=name
self.gender=gender
self.mother=mother
self.marriedTo=None
def add_partner(self,marriedTo):
"""
Assigns passed marriedTo value to marriedTo attribute to calling objects
"""
if marriedTo != self.marriedTo:
self.marriedTo=marriedTo
class FamiltyTree(Relationships):
familyMembers=OrderedDict()
def __init__(self,initialTree):
for i,line in enumerate(initialTree):
# print('executing command',i,' : ',line)
self.excommand(line)
def excommand(self,command):
"""
Executes the passed command
Commands : ADD_CHILD, GET_RELATIONSHIP
"""
argument=command.split()
if argument[0]=='ADD_CHILD':
# print('adding child')
p=Person(argument[1], argument[2], argument[3])
return self.add_Person(p)
if argument[0]=='AM':
# print('adding married to')
return self.add_MarriedTo(argument[1], argument[2])
if argument[0]=='GET_RELATIONSHIP':
if argument[1] not in self.familyMembers:
return 'PERSON_NOT_FOUND'
# print('getting relationship',argument[2], 'for : ',argument[1])
**res= getattr(self,argument[2].replace('-','_'))(argument[1])**
if res:
return ' '.join(res)
return None
def add_Person(self,person):
"""
Adds passed Person to Family members, of calling object of FamiltyTree
"""
if person.mother!='None' and person.mother not in self.familyMembers:
return 'PERSON_NOT_FOUND'
if isinstance(person,Person) and person.name not in self.familyMembers and (person.mother=='None' or self.familyMembers[person.mother].gender=='Female'):
self.familyMembers[person.name]=person
return 'CHILD_ADDITION_SUCCEEDED'
else:
return 'CHILD_ADDITION_FAILED'
def add_MarriedTo(self,person1,person2):
"""
sets marriedTo Relationship among both passed person objects to each other.
"""
if person1 in self.familyMembers and person2 in self.familyMembers:
for key , value in self.familyMembers.items():
if key==person1:
value.add_partner(person2)
if key==person2:
value.add_partner(person1)
return True
else:
return False
class Relationships():
def Father(self,name):
"""
Finds Father of passed person name
"""
if name in self.familyMembers:
for key , value in self.familyMembers.items():
if self.familyMembers[self.familyMembers[name].mother].marriedTo==key:
return key
return None