2013年6月17日月曜日

開発環境

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

その他参考書籍

まとめ演習6.(__bases__属性)

sample.py

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

class Lister:
    def __repr__(self):
        result = "<Instance of " + self.__class__.__name__
        bases = self.__class__.__bases__
        if bases:
            result += "(" + ", ".join([base.__name__ for base in bases]) + ")"
        result += ", address {0}:\n{1}".format(
            id(self), self.attrnames())
        for base in bases:
            result += self.classtree(base, 1)
        result += ">"
        return result
    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])
        return result
    def classtree(self, cls, indent):
        result = "{0}super class: {1}".format("\t" * indent, cls.__name__)
        bases = cls.__bases__
        if bases:
            result += "({0})".format(
                ", ".join([base.__name__ for base in bases]))
        result += "\n"
        for k, v in cls.__dict__.items():
            if k[:2] == "__":
                result += "{0}name {1}=<built-in>\n".format(
                    "\t" * (indent + 1), k)
            else:
                result += "{0}name {1}={2}\n".format(
                    "\t" * (indent + 1), k, v)
        for base in bases:
            result += self.classtree(base, indent + 1)
        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__':
    x = Sub()
    print(x)    

入出力結果(Terminal)

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

0 コメント:

コメントを投稿