Chinaunix首页 | 论坛 | 博客
  • 博客访问: 457883
  • 博文数量: 97
  • 博客积分: 1552
  • 博客等级: 上尉
  • 技术积分: 1091
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-17 17:05
个人简介

专注于大规模运维场景运维工具解决方案。欢迎有这方面兴趣的朋友跟我联系。

文章分类

全部博文(97)

文章存档

2014年(12)

2013年(25)

2012年(60)

我的朋友

分类: Python/Ruby

2012-07-25 15:13:53

理论:
1. globals()
全局变量那就 globals().update(dic).这样就可以将一个字典变量弄成全局变量.
创建动态类两种方式:
from new import classobj
myClass = classobj('className',(baseClass,),{dictAttr:dictValue,...})
参数说明:
classobj(类名,基类列表--必须是tuple,属性字典)
这个时候类的名字不等于类的索引,上面创建的类需要通过myClass来使用。
如果想要把类自己的名字来引用,就像传统的class关键字定义那样,则需要把类的名字加入到全局作用域globals()
globals()['className'] = type('className',(baseClass,),{dictAttr:dictValue,...})

2. 来看示例

点击(此处)折叠或打开

  1. class Base(object):
  2.     name = "yao"
  3.     age = 23
  4.     def setUp(self):
  5.         if hasattr(self, "name"):
  6.             print "setUp, %s" % getattr(self, "name")

  7. from new import classobj
  8. myClass= classobj("HelloClass", (Base, ), {"***":"boy", "school":"hn"})
  9. myobject = myClass()
  10. myobject.setUp()
  11. print myobject.*** + " ->" + str(myobject.age)
  12. # >>>
  13. print getattr(myobject, "school")


  14. def initParent():
  15.     globals()['MyChildClass']=type("MyChildClass", (Base, ), {"***":"girl",
  16.         "school":"nn"})

  17. initParent()
  18. myobject = MyChildClass()
  19. myobject.newAttr = "hello"  #动态创建属性

  20. print myobject.***, myobject.school
  21. print getattr(myobject, "newAttr")

  22. class A(MyChildClass):      #MyChildClass就是动态创建的类。
  23.     def testup(self):
  24.         if hasattr(self, "***"):
  25.             print " have *** attritue, %s" % getattr(self, "***")
  26.         
  27.         if hasattr(self, "newAttr"):  #这样的属性就没有了
  28.             print "HAVEing!"
  29. a = A()
  30. a.testup()
输出:
setUp, yao
boy ->23
hn
girl nn
hello
have *** attritue, girl
一种应用的场景:
比如在CMDB里面会有多种manfiest设备类型,会有多种类型会有各种不一样的child方法。
这样如果 需要创建多个父类的话可以传递一个变量进去就可以生成多个类。然后就可以继承
可以节省不少的代码量.

阅读(9296) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~