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

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. jsp数据交互(一),九大内置对象

    九大内置对象 九大内置对象 内置对象 类型 说明 作用域 request javax.servlet.ServletRequest 请求对象——在 一次请求/一个Request请求周期 中传递数据,请 ...

  2. input标签name与value区别

    id是唯一标识符,不允许有重复值(类似数据表的主键)可以通过它的值来获得对应的html标签对象.(如果在同一页面代码中,出现重复的id,会导致不可预料的错误) name:单独地在一个网页里面,一个控件 ...

  3. 电脑重装系统后如何恢复Mysql数据库

    电脑重装系统后如何恢复Mysql数据库 一.[设置mysql的path]

  4. 4 多表代替密码之Hill 密码_1 矩阵工具类

    在说明Hill加密之前要先复习线性代数的知识,主要是关于矩阵的一些运算和概念. 一.矩阵的逆: 定义方阵M的逆矩阵应该满足M*M^-1==I,其中I是单位矩阵,比如: 但是这个地方是对英文字母进行加密 ...

  5. PAT题库-1064. Complete Binary Search Tree (30)

    1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...

  6. UCanCode发布升级E-Form++可视化源码组件库2015全新版 (V23.01)!

    2015年4月. 成都 UCanCode发布升级E-Form++可视化源码组件库2015全新版 (V23.01)! --- 全面性能提升,UCanCode有史以来最强大的版本发布! E-Form++可 ...

  7. 华为交换机netstream配置

    1.配置交换机的流发送 [系统视图]ip netstream timeout active 100         流活跃时间 [系统视图]ip netstream timeout inactive ...

  8. 深入理解css系列:meta标签

    积累太少,时间管理技巧欠缺,所以导致了博客更新的速度迟缓.学习中成长,成长中学习.加油吧!最近在做h5的项目,对于meta标签层出不穷的各式属性值有点头晕,所以查资料整理了下. 关键字:meta na ...

  9. MySQL - MySQL++在c++11环境下接口设计

    安装官方提供的mysqlconnect后,可以使用mysql++库,在官方的C API上再次做一个c++面向对象封装. 这里mysql++的安装依赖于mysql-connector-c.安装参考:ht ...

  10. Nginx反向代理配置可跨域

    由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...