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

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


python之元编程(元类实例)的更多相关文章

  1. python之元编程

    一.什么是元编程 元编程是一种编写计算机程序的技术,这些程序可以将自己看作数据,因此你可以在运行时对它进行内省.生成和/或修改. Python在语言层面对函数.类等基本类型提供了内省及实时创建和修改的 ...

  2. C++ 元编程 —— 让编译器帮你写程序

    目录 1 C++ 中的元编程 1.1 什么是元编程 1.2 元编程在 C++ 中的位置 1.3 C++ 元编程的历史 2 元编程的语言支持 2.1 C++ 中的模板类型 2.2 C++ 中的模板参数 ...

  3. Java元编程及其应用

    首先,我们且不说元编程是什么,他能做什么.我们先来谈谈生产力. 同样是实现一个投票系统,一个是python程序员,基于django-framework,用了半小时就搭建了一个完整系统,另外一个是标准的 ...

  4. Java 元编程及其应用

    Java 元编程及其应用 首先,我们且不说元编程是什么,他能做什么.我们先来谈谈生产力. 同样是实现一个投票系统,一个是python程序员,基于django-framework,用了半小时就搭建了一个 ...

  5. ES6入门九:Symbol元编程

    JS第七种数据类型:Symbol Symbol的应用场景 11个Symbol静态属性 Symbol元编程 一.JS第七种数据类型:Symbol 在ES6之前的JavaScript的基本数据类型有und ...

  6. 201706 Ruby 基础 & 元编程

    yield yield self Proc yield带参数 rails中:yield 和 content_for methods.proc.lambda.block 闭包(用proc延长变量的生命周 ...

  7. Julia体验 语言特性 元编程,宏

    上接语言基础,就release-1.1来看,个人感觉这门语言和自己心中的理想国相距较远.这门语言因为受众不仅仅是程序员有很多让人迷惑的设计,但是奇怪的是它的语法等表象设计虽然暗示这不是专门为程序员准备 ...

  8. 可爱的 Python : Python中函数式编程,第二部分

    英文原文:Charming Python: Functional programming in Python, Part 2,翻译:开源中国 摘要:  本专栏继续让David对Python中的函数式编 ...

  9. python入门学习:8.类

    python入门学习:8.类 关键点:类 8.1 创建和使用类8.2 使用类和实例8.3 继承8.4 导入类 8.1 创建和使用类   面向对象编程是最有效的软件编写方法之一.在面向对象编程中,你编写 ...

随机推荐

  1. oracle通过修改控制文件scn推进数据库scn

    数据库当前scn 代码如下 复制代码 idle> select checkpoint_change# from v$database; CHECKPOINT_CHANGE#----------- ...

  2. ad画fpc

    得到新技能 后记: 实际情况,复杂很多pin的fpc 都是用cad画的.我明天学...

  3. GnuRadio Hacking①:使用GnuRadio+SDR破解固定码无线遥控

    0×01 信号捕获 在这篇文章中,我们将使用GnuRadio+SDR硬件对某品牌型号的无线跳蛋进行无线重放攻击的演示. 市面上常见的无线遥控工作的频段,通常工作在315Mhz.433Mhz,也有少数的 ...

  4. maven 配置

    四.eclipse配置maven eclipse---window---maven------User Settings: 之前设置的仓库的位置: 五.idea15配置maven idea14---s ...

  5. 最新Xcode7.x环境下上架iOS App到AppStore 完整流程

    最新Xcode7.x环境下上架iOS App到AppStore 流程  part 1 前言部分 之前App要上架遇到些问题到网上搜上架教程发现都是一些老的版本的教程 ,目前iTunesConnect ...

  6. SQL Server 2005 处理交叉表

    假设有一个表如下: 日期 时间 售货金额 2006-01-02 早上 50 2006-01-02 中午 20 2006-01-02  晚上 30 2006-01-02 零晨 40 2006-01-03 ...

  7. DOM事件简介--摘自admin10000

    Click.touch.load.drag.change.input.error.risize — 这些都是冗长的DOM(文档对象模型)事件列表的一部分.事件可以在文档(Document)结构的任何部 ...

  8. iOS信号量的使用

    Core Audio render thread and thread signalling up vote2down votefavorite   Does iOS have any kind of ...

  9. 【转】jenkins持续集成配置

    搭建jenkins持续集成服务器 1.jenkins简介 Jenkins,前身为Hudson,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,包括: 持续的软件版本发布/测试项目. 监控 ...

  10. Magento代码之订单创建流程

    Magento代码之订单创建流程         直接看代码吧.下面的代码是如何通过程序创建一个完美订单.        <?php        require_once 'app/Mage. ...