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