grandparent method with super

John Clark clajo04 at mac.com
Thu Apr 5 16:55:38 EDT 2007


>> Pretty sure you can do this:
>> 
>> class A(object):
>> 	def m(self):
>> class B(A):
>> 	def m(self):
>> class C(A):
>> 	def m(self):
>> class D(B,C):
>> 	def m(self):
>> 		A.m(self)
>>  
>> I don't think you want to try to use super() in this case.
>
>That works, but when I replace A with something else, I do not get the
grandparent anymore 
>without changing all the method calls. Basically, I would like to call the
method m in the first 
>grandparent of D.
>
>Martin

I think the problem you may run into is with the term "first grandparent" -
when you look at the method resolution order of the class D, you will find
that the MRO goes "D, C, B, A"... I think it's going to be difficult to
figure out where the "first grandparent" is in the MRO. 

For example: 

class A(object):
	def m(self):
		pass
class B(A):
	def m(self):
		pass
class C(B):
	def m(self):
		pass
class D(A):
	def m(self):
		pass
class E(C,D):
	def m(self):
		firstgrandparent(E,self).m() #Should call B.m
class F(D,C):
	def m(self):
		firstgrandparent(F,self).m() # Should call F.m


The mro for class E is going to be "E,C,B,D,A" where as the mro for class F
is going to be "F,D,C,B,A".  However, the first grandparent for E should be
B, where as the first grandparent for F should be A.  

Because the MRO isn't just a depth first traversal, the term "first
grandparent" gets tricky to define...

-jdc 


--
http://mail.python.org/mailman/listinfo/python-list




More information about the Python-list mailing list