SHARE
TWEET

inherit.py

rdrewd Mar 25th, 2013 48 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. def merge(seqs):
  2.     print '\n\nCPL[%s]=%s' % (seqs[0][0],seqs),
  3.     res = []; i=0
  4.     while 1:
  5.       nonemptyseqs=[seq for seq in seqs if seq]
  6.       if not nonemptyseqs: return res
  7.       i+=1; print '\n',i,'round: candidates...',
  8.       for seq in nonemptyseqs: # find merge candidates among seq heads
  9.           cand = seq[0]; print ' ',cand,
  10.           nothead=[s for s in nonemptyseqs if cand in s[1:]]
  11.           if nothead: cand=None #reject candidate
  12.           else: break
  13.       if not cand: raise "Inconsistent hierarchy"
  14.       res.append(cand)
  15.       for seq in nonemptyseqs: # remove cand
  16.           if seq[0] == cand: del seq[0]
  17.  
  18. def mro(C):
  19.     "Compute the class precedence list (mro) according to C3"
  20.     print "C.__dict__=", C.__dict__
  21.     return merge([[C]]+map(mro,C.__bases__)+[list(C.__bases__)])
  22.  
  23. def print_mro(C):
  24.     print '\nMRO[%s]=%s' % (C,mro(C))
  25.     print '\nP22 MRO[%s]=%s' % (C,C.mro())
  26.  
  27. class A(object):
  28.     def __init__(self):
  29.         self.a = 1
  30.     def x(self):
  31.         print "A.x"
  32.     def y(self):
  33.         print "A.y"
  34.     def z(self):
  35.         print "A.z"
  36.  
  37. class B(A):
  38.     def __init__(self):
  39.         A.__init__(self)
  40.         self.a = 2
  41.         self.b = 3
  42.     def y(self):
  43.         print "B.y"
  44.     def z(self):
  45.         print "B.z"
  46.  
  47. class C(object):
  48.     def __init__(self):
  49.         self.a = 4
  50.         self.c = 5
  51.     def y(self):
  52.         print "C.y"
  53.     def z(self):
  54.         print "C.z"
  55.  
  56. class D(C, B):
  57.     def __init__(self):
  58.         C.__init__(self)
  59.         B.__init__(self)
  60.         self.d = 6
  61.     def z(self):
  62.         print "D.z"
  63.  
  64. # Which __init__ methods are invoked and in which order is determined by the cod
  65. ing of the individual __init__ methods.
  66.  
  67. # When resolving a reference to an attribute of an object that's an instance of
  68. class D, Python first searches the object's instance variables then uses a simpl
  69. e left-to-right, depth first search through the class hierarchy. In this case th
  70. at would mean searching the class C, followed the class B and its superclasses (
  71. ie, class A, and then any superclasses it may have, et cetera).
  72.  
  73. # With the definitions above if we define
  74.  
  75. obj = D()
  76. print "D.__dict__=", D.__dict__
  77. print_mro(D)
  78.  
  79. # then what is printed by each of the following statements?
  80.  
  81. print obj.a
  82.  
  83. print obj.b
  84.  
  85. print obj.c
  86.  
  87. print obj.d
  88.  
  89. obj.x()
  90.  
  91. obj.y()
  92.  
  93. obj.z()
RAW Paste Data
Top