pythontypeobject_0">1、python中一切都是对象,类也不例外,type是object的子类,是创建类的类。
如何动态的创建一个类?
- 用脚丫子创建
- 用脑子创建
- 不会
- 不知道什么事动态类
大家可能会有一堆的疑惑,是的我也是有很多疑惑那让我们一起来探个究竟,请看如下的例子:
python">def create_cls(class_name):
if classname == 'app':
class App:
name = "abc"
def __str__(self):
retuen "app"
return App
else classname == 'web':
class Web:
def __str__(self):
return "web"
return Web
if __name__ == "__main__":
meclass = create_cls('web')
obj = meclass() # 这样我们就实现了动态的创建类,
# 通过在函数create_cls中输入不同的class_name 来创建不同的类
print(obj)
当然以上的方法虽然能实现我们的目的,但是看起来很Low,对不对?
- 是的,糟糕透了
- 看起来还可以嘛
- 非常不错了
- 哈哈哈
那么还有更好的方法吗?让我们一起来探索一下。
2、本文第一点中提到,type是创建类的类,那么,让我们看一下type是怎么动态创建类的?
这里提示一下,当我们想了解python的类或函数用法时,第一选择就是用pyCharm中的Ctrl+鼠标点击类或函数,进行查看,查看注释去了解类的用法和作用。实在看不懂在百度呗
(1)先查看type下__init__中的注释
(2)上手
python"># App = type("App", (), {})
# 参数解析
# 1、第一个参数是类的名字
# 2、第二个参数是tuple类型,是我们创建的这个类所要继承的基类(这里没有要继承的所以为空)
# 3、第三个参数是dict类型,是所创建类的属性,(这里我们没有属性,留空)
if __name__ == "__main__":
App = type("App", (), {})
mecls = App()
print(mecls) # 打印后看到是main模块下的App类
扩展,添加一个属性,等同于第一点中的App下的name
App = type("App", (), {"name": "abc"})
mecls = App()
print(mecls.name) # 打印name属性
(3)疑问来了,这样创建的类怎么给他添加函数呢?
请看下边。。。。
python">
def first:
return "my name is first"
if __name__ == "__main__":
App = type("App", (), {"name": "abc", "first": first}) # 注意这里是函数的名称
mecls = App()
print(mecls.first()) # 打印调用的函数,返回 my name is first
(4)那么我想继承其他类的,该怎么操作?
python">
def first:
return "my name is first"
#创建基类
class Base:
def zero:
return "I am Base"
if __name__ == "__main__":
App = type("App", (Base, ), {"name": "abc", "first": first}) # 将基类名称放到括号中,并且记得加逗号,因为是元组
mecls = App()
print(mecls.zero()) # 打印调用的函数,返回 I am Base
3、什么是元类,如何自定义元类
(1)元类是一种创建类的类,我们的type就是元类。type > class > 对象, class也是对象。
待补充。。。。。