開発環境
- OS X Lion - Apple(OS)
- TextWrangler(Text Editor) (BBEditの無料機能制限版、light版)
- Script言語: Python
『初めての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 コメント:
コメントを投稿