Replace Whole Object Through Object Method

I V wrongbad at gmail.com
Tue Jun 27 04:16:54 EDT 2006


On Mon, 26 Jun 2006 19:40:52 -0700, digitalorganics wrote:
> A misuse of inheritance eh? Inheritance, like other language features,
> is merely a tool. I happen to be using this tool to have my virtual
> persons change roles at different points in their lifetime, as many
> real people tend to do. Thus, at these points, B is indeed an A. What a
> person is, whether in real life or in my program, is not static and
> comes into definition uniquely for each moment (micro-moment, etc.) of
> existence. Now, please, I have no intention of carrying the
> conversation in such a silly direction, I wasn't inviting a discussion
> on philosophy or some such. I seek to work the tools to my needs, not
> the other way around.

But thinking about the problem in the vocabulary provided by the
programming language can be helpful in coming up with a solution. If
inheritance tells you what an object _is_, and membership tells you what a
role _has_, and a role is something that a person has, that suggests
that an implementation where roles are members of a person might be
simpler than trying to use inheritance. Like, for instance:

class Role(object):
	def __init__(self, person):
		self.person = person


class Worker(Role):
	def do_work(self):
		print self.name, "is working"


class Employer(Role):

	def __init__(self, person):
		Role.__init__(self, person)
		self.employees = []


	def add_employee(self, worker):
		self.employees.append(worker)


	def boss_people_around(self):
		for employee in employees:
			print self.name, "is telling", employee.name, "what to do"


class Person(object):

	def __init__(self, name):
		self.roles = []
		self.name = name


	def add_role(self, role_class):
		self.roles.append(role_class(self))


	def forward_to_role(self, attr):
		for role in self.roles:
			try:
				return getattr(role, attr)
			except AttributeError:
				pass
		raise AttributeError(attr)

	
	def __getattr__(self, attr):
		self.forward_to_role(attr)


bill = Person('Bill')
bill.add_role(Worker)

bob = Person('Bob')
bob.add_role(Employer)

bill.work()
bob.boss_people_around()




More information about the Python-list mailing list