python之元編程(元類實例)


本實例是元類實例,功能是記錄該的子類的類名,並以樹狀結構展示子類的類名。

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





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM