如何动态的创建类?type的其他用法?什么是元类,如何自定义元类?

news/2024/6/17 19:41:11 标签: python, pycharm, 开发语言, type类

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 Basedef 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也是对象。

待补充。。。。。


http://www.niftyadmin.cn/n/77780.html

相关文章

设计模式之迭代器模式与命令模式详解和应用

目录1 迭代器模式1.1 目标1.2 内容定位1.3 迭代器模式1.4 迭代器模式的应用场景1.5 手写字定义的送代器1.6 迭代器模式在源码中的体现1.7 迭代器模式的优缺点2 命令模式2.1 定义2.2 命令模式的应用场景2.3 命令模式在业务场景中的应用2.4 命令模式在源码中的体现2.5 命令模式的…

pytest总结

这里写目录标题一、pytest的命名规则二、界面化配置符合命名规则的方法前面会有运行标记三、pytest的用例结构三部分组成四、pytest的用例断言断言写法:五、pytest测试框架结构六、pytest参数化用例1、pytest参数化实现方式2、单参数:每一条测试数据都会…

建造《流浪地球2》中要毁灭人类的超级量子计算机MOSS的核心量子技术是什么?

1.《流浪地球2》中的量子计算机 2023年中国最火的电影非《流浪地球2》莫属,在《流浪地球2》中有一个人工智能机器人MOSS ,它的前身是“550W”超级量子计算机,“MOSS”是它给自己起的名字(“550W”倒转180度就是“MOSS”&#xff…

XCP实战系列介绍15-XCP故障排查指导

本文框架 1.概述2. 通过调试器排查2.1 打开Det功能2.2 如何确定Det ErrorCode3. 通过XCP应答报文排查3.1 FE报文组成及故障码对应关系3.2 举个例子1.概述 前面几篇文章我们介绍了基于Davinci开发工具的XCP配置指导,配好了,代码也生成了,但是程序一定能正常跑起来吗?就算软…

paddle 49 ODConv的可部署调整

ODConv是一种适用于轻量化模型的conv结构,可以在较少的参数下训练出多参数模型才能达到的精度,在相同的flop下可以稳定的涨2-3%个点。但是在paddle下部署ODConv动态卷积模型时会报出各种异常,导致模型无法转静态图或onnx格式(可能在pytorch下也是无法转换的)。为此研究ODC…

48.在ROS中实现local planner(1)- 实现一个可以用的模板

有了之前45.在ROS中实现global planner(1)- 实现一个可以用模板的global planner的经验, 现在再去创建一个local planner的包就容易多了 1. 创建包 创建 cd ~/pibot_ros/ros_ws/src # 这里可以使用自己的ros workspace catkin_create_pkg sample_loc…

Rancher 部署 MySQL

文章目录创建 pvc部署 MySQL前置条件:安装 rancher,可参考文章 docker 部署 rancher 创建 pvc MySQL 数据库是需要存储的,所以必须先准备 pvc 创建 pvc 自定义 pvc 名称选择已经新建好的 storageclass,storageclass 的创建可参考…

PyTorch - Conv2d 和 MaxPool2d

文章目录Conv2d计算Conv2d 函数解析代码示例MaxPool2d计算函数说明卷积过程动画Transposed convolution animationsTransposed convolution animations参考视频:土堆说 卷积计算 https://www.bilibili.com/video/BV1hE411t7RN 关于 torch.nn 和 torch.nn.function t…