博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之元编程(元类实例)
阅读量:6431 次
发布时间:2019-06-23

本文共 2311 字,大约阅读时间需要 7 分钟。

本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名。

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

 

转载于:https://www.cnblogs.com/passion-hzhang/p/6001260.html

你可能感兴趣的文章
android笔试题一
查看>>
【JavaEE企业应用实战学习记录】getConnListener
查看>>
了解轮询、长轮询、长连接、websocket
查看>>
bzoj2427[HAOI2010]软件安装
查看>>
bzoj1593[Usaco2008 Feb]Hotel 旅馆*
查看>>
WPF个人助手更新
查看>>
NLPIR技术助力中文智能数据挖掘
查看>>
python操作redis--------------数据库增删改查
查看>>
Android中仿IOS提示框的实现
查看>>
php初学第一课
查看>>
Windows下与Linux下编写socket程序的区别 《转载》
查看>>
java学习笔记 --- IO(3)
查看>>
Mysql 的FIND_IN_SET函数慢的忧化
查看>>
Web service是什么?
查看>>
python 问题集合
查看>>
豌豆荚工程师谈其新版应用搜索技术
查看>>
螺旋阵(递归和非递归)
查看>>
我的爷爷(知识渊博的下乡知青)
查看>>
jQuery动画连续触发、滞后反复执行解决办法
查看>>
uva 10405 Longest Common Subsequence
查看>>