本實例是元類實例,功能是記錄該的子類的類名,並以樹狀結構展示子類的類名。
RegisterClasses繼承自type,提供的功能是在__init__接口,為類創建了childrens的集合,並類名保存到對應的父類元組的childrens的集合中。
同時對__str__打印方法和__iter__迭代方法進行了定義,其中:
__iter__方法返回類名的childrens集合,並對其中的元素進行輸入。
而Sharp繼承自RegisterClasses, 當 for s in Sharp: print s,則會調用繼承來的__iter__方法。
class Round(Shape): pass
class Square(Shape): pass
class Triangular(Shape): pass
class Boxy(Shape): pass
上述操作中,Round,Square,Triangular,Boxy均初始化一個childrens的集合,
同時,均將自身的類名添加到Shape元類的childrens的集合里。
class Circle(Round): pass
class Ellipse(Round): pass
上述操作中,Circle,Ellipse均初始化一個childrens的集合,
同時,均將自身的類名添加到Round,Shape的childrens的集合里,
原因是:Round的父類是Shape,故Circle,Ellipse均有兩個父類。
代碼如下:
#!/usr/bin/env python
# encoding: utf-8
"""
@author:
@contract:
@file: homework5_1.py
@time: 2016/10/26 14:22
"""
class RegisterClasses(type):
def __init__(cls, name, bases, atts):
super(RegisterClasses, cls).__init__(name, bases, atts)
#創建一個集合,這樣繼承元類,都會有一個childrens的集合
cls.childrens = set()
#將把當前的子類保存到父類中去
for base in bases:
if hasattr(base, 'childrens'):
base.childrens.add(cls)
#classmethod, called on class object
def __iter__(cls):
return iter(cls.childrens)
def __str__(cls):
if len(cls.childrens) > 0:
return cls.__name__ + ": " + ", ".join([sc.__name__ for sc in cls])
else:
return cls.__name__
class Shape(object):
__metaclass__ = RegisterClasses
print "---------------------"
class Round(Shape): pass
class Square(Shape): pass
class Triangular(Shape): pass
class Boxy(Shape): pass
print Shape
print "---------------------"
class Circle(Round): pass
class Ellipse(Round): pass
print Shape
print "---------------------"
for s in Shape: #Iterator over subclasses (def __str__(cls):)
print s
print "---------------------"
for cls in Shape.childrens:
if len(cls.childrens) > 0:
print cls.__name__ + ": " + ", ".join([sc.__name__ for sc in cls])
else:
print cls.__name__
輸出如下:
---------------------
Shape: Triangular, Boxy, Square, Round
---------------------
Shape: Triangular, Boxy, Square, Round
---------------------
Triangular
Boxy
Square
Round: Ellipse, Circle
---------------------
Triangular
Boxy
Square
Round: Ellipse, Circle