2012年2月27日月曜日

開発環境

『初めてのPython 第3版』(Mark Lutz 著、夏目 大 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-393-7)のVI部(クラスとオブジェクト指向プログラミング)のまとめ演習の練習問題6(__base__属性)を解いてみる。

6.

コード(TextWrangler)

#!/usr/bin/env python
#encoding: utf-8

class Top:
 def __init__(self):
  self.data = 'top'
  
class Super(Top):
 def __init__(self):
  self.data5 = 'super1'
  self.data6 = 'super2'

class Lister:
 def __init__(self):
  self.data4 = 'lister'
 def __repr__(self):
  return ("<Instance of %s(%s), address %s:\n%s>" %
      (self.__class__.__name__,
       self.superclasses(),
       id(self),
       self.attrnames(),
       ) )
 def attrnames(self):
  result = ''
  for attr in self.__dict__.keys():
   if attr[:2] == '__':
    result += "\tname %s=<built-in>\n" % attr
   else:
    result += "\tname %s=%s\n" % (attr, self.__dict__[attr])
  return result
 def superclasses(self):
  result = ''
  bln = 0
  for superclass in self.__class__.__bases__:
   if bln:
    result += ', '
   bln = 1
   result += superclass.__name__
  return result
  
class Sub(Super,Lister):
 def __init__(self):
  self.data1 = 'sub1'
  self.data2 = 'sub2'
  self.data3 = 'sub3'

if __name__ == '__main__':
 a = Sub()
 print a

入出力結果(Terminal)

$ ./python_program.py
<Instance of Sub(Super, Lister), address 4422563168:
 name data1=sub1
 name data3=sub3
 name data2=sub2
>
$

スーパークラスの属性のリストも表示されるように修正。

コード(TextWrangler)

#!/usr/bin/env python
#encoding: utf-8

  
class Super:
 def __init__(self):
  self.data5 = 'super1'
  self.data6 = 'super2'

class Lister:
 def __init__(self):
  self.data4 = 'lister'
 def __repr__(self):
  return ("" %
      (self.__class__.__name__,
       self.superclasses(),
       id(self),
       self.attrnames(),
       self.f()) )
 def attrnames(self):
  result = ''
  for attr in self.__dict__.keys():
   if attr[:2] == '__':
    result += "\tname %s=<built-in>\n" % attr
   else:
    result += "\tname %s=%s\n" % (attr, self.__dict__[attr])
  return result
 def superclasses(self):
  result = ''
  bln = 0
  for superclass in self.__class__.__bases__:
   if bln:
    result += ', '
   bln = 1
   result += superclass.__name__
  return result
 def f(self):
  result = ''
  for superclass in self.__class__.__bases__:
   result += '\tclass %s\n' % superclass.__name__
   for attr in superclass.__dict__.keys():
    if attr[:2] == '__':
     result += "\t\tname %s=<built-in>\n" % attr
    else:
     result += "\t\tname %s=%s\n" % (attr, superclass.__dict__[attr])
  return result
  
class Sub(Super,Lister):
 def __init__(self):
  self.data1 = 'sub1'
  self.data2 = 'sub2'
  self.data3 = 'sub3'

if __name__ == '__main__':
 a = Sub()
 print a

入出力結果(Terminal)

$ ./python_program.py
<Instance of Sub(Super, Lister), address 4439094480:
 name data1=sub1
 name data3=sub3
 name data2=sub2

 class Super
  name __module__=<built-in>
  name __doc__=<built-in>
  name __init__=<built-in>
 class Lister
  name __module__=<built-in>
  name f=<function f at 0x10896dc80>
  name attrnames=<function attrnames at 0x108964c80>
  name __repr__=<built-in>
  name superclasses=<function superclasses at 0x10896dc08>
  name __doc__=<built-in>
  name __init__=<built-in>
>
$

さらに、直接のスーパークラスだけではなくアクセス可能なすべてのスーパークラスのも表示できるようにしようとしたけど、再帰関数のところでつまずく。ということで次回はできるようになってることを期待しつつ次へ進むことに。

0 コメント:

コメントを投稿