2013年1月8日火曜日

開発環境

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

その他参考書籍

6.(__bases__属性)

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

class Lister:
    def __repr__(self):
        return ("<Instance of {0}({1}), address {2}:\n{3}>".format(
          self.__class__.__name__,
          self.superclasses(self.__class__),
          id(self),
          self.attrnames()))
    def attrnames(self):
        result = ''
        for attr in self.__dict__.keys():
            if attr[:2] == '__':
                result += "\tname {0}=<built-in>\n".format(attr)
            else:
                result += "\tname {0}={1}\n".format(attr, self.__dict__[attr])
        for cls in self.__class__.__bases__:
            result += self.cls_attrnames(cls)
        return result
    def superclasses(self, cls):
        result = ""
        first = 1
        for superclass in cls.__bases__:
            if not first:
                result += ", "
            first = 0
            result = result + superclass.__name__
            if superclass.__bases__:
                result += "({0})".format(self.superclasses(superclass))
        return result
    def cls_attrnames(self, cls):
        result = "\tclass {0}\n".format(cls.__name__)
        if not dir(cls):
            result += "\tno attribute\n"
        for name in dir(cls):
            if name[:2] == '__':
                result += "\tname {0}<built-in>\n".format(name)
            else:
                result += "\tname {0}={1}\n".format(name, getattr(cls, name))   
        return result

class Super:
    def __init__(self):
        self.data1 = "spam"

class Sub(Super, Lister):
    def __init__(self):
        Super.__init__(self)
        self.data2 = "eggs"
        self.data3 = 42

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

入出力結果(Terminal)

$ ./sample.py
<Instance of Sub(Super(object), Lister(object)), address 4485777680:
 name data2=eggs
 name data3=42
 name data1=spam
 class Super
 name __class__<built-in>
 name __delattr__<built-in>
 name __dict__<built-in>
 name __dir__<built-in>
 name __doc__<built-in>
 name __eq__<built-in>
 name __format__<built-in>
 name __ge__<built-in>
 name __getattribute__<built-in>
 name __gt__<built-in>
 name __hash__<built-in>
 name __init__<built-in>
 name __le__<built-in>
 name __lt__<built-in>
 name __module__<built-in>
 name __ne__<built-in>
 name __new__<built-in>
 name __qualname__<built-in>
 name __reduce__<built-in>
 name __reduce_ex__<built-in>
 name __repr__<built-in>
 name __setattr__<built-in>
 name __sizeof__<built-in>
 name __str__<built-in>
 name __subclasshook__<built-in>
 name __weakref__<built-in>
 class Lister
 name __class__<built-in>
 name __delattr__<built-in>
 name __dict__<built-in>
 name __dir__<built-in>
 name __doc__<built-in>
 name __eq__<built-in>
 name __format__<built-in>
 name __ge__<built-in>
 name __getattribute__<built-in>
 name __gt__<built-in>
 name __hash__<built-in>
 name __init__<built-in>
 name __le__<built-in>
 name __lt__<built-in>
 name __module__<built-in>
 name __ne__<built-in>
 name __new__<built-in>
 name __qualname__<built-in>
 name __reduce__<built-in>
 name __reduce_ex__<built-in>
 name __repr__<built-in>
 name __setattr__<built-in>
 name __sizeof__<built-in>
 name __str__<built-in>
 name __subclasshook__<built-in>
 name __weakref__<built-in>
 name attrnames=<function Lister.attrnames at 0x10b604170>
 name cls_attrnames=<function Lister.cls_attrnames at 0x10b604290>
 name superclasses=<function Lister.superclasses at 0x10b604200>
>
$

0 コメント:

コメントを投稿