python 动态构造类 type

3.4 python动态创建类和函数的技术 摘要:Python支持在运行时动态创建类和函数,这是元编程的核心技术。type()函数不仅可以查询类型,还能作为类构造器,接收名称、基类和属性字典三个参数来动态创建类。types模块的FunctionType则可动态创建函数。这些技术适用于动态数据模型、定制化类生成等场景,如根据字段列表动态生成数据模型类。虽然动态创建提供了极大灵活性,但需注意调试困难、性能影响和可读性问题,建议谨慎使用并结合最佳实践如__slots__优化和清晰的文档说明。(149字) 阅读详情

1. 使用 getattr

#a.py
    class b(){...}
#c.py
package = __import__('a')
temp_class    = getattr(package,'b')
temp = temp_class() #b()

如果是在当前文件中,则


import sys

class F:
    def __init__:
        ......


getattr(sys.modules[__name__], 'F')()

2. 使用global 

class A():
    def __init__(self): print('A')

class B():
    def __init__(self): print('B')

globals()['A']()
globals()['B']()

global太好用了 

import uuid
import threading
import os,sys
import grpc

current_path = os.path.dirname(__file__)
sys.path.append(os.path.join(current_path, 'grpc_bin'))


import grpc_bin.journal_event_pb2 as pb_event
import grpc_bin.journal_event_pb2_grpc as journal_event_pb2_grpc
from grpc_bin.journal_event_pb2 import User

queue_locker = threading.Lock()

class Node :
    def __init__(self, name, service_name, method_name, server_info="localhost:50052", input_value=None, input_type=None, pre=None, next=None):
        self.status = "Waiting"  # "Ready"  "Waiting" "Running" 'Done'
        self.ID = uuid.uuid4()
        self.name= name
        self.service_name = service_name
        self.server_info = server_info
        self.method = method_name
        self.input_data = input_value
        self.input_type = input_type
        self.pre = pre
        self.next = next

    def execute(self):
        print(f"Execute node : {self.name}")


        # aa = globals()[self.input_type]()
        # print(dir(aa))
        # aa.ParseFromString(self.input_data)
        # print(aa)

        request = globals()[self.input_type]()
        request.ParseFromString(self.input_data)
        restful_api = f"/{self.service_name}/{self.method}"
        with grpc.insecure_channel(self.server_info) as channel:
            func = channel.unary_unary(
                # '/JournalEvents/GetFileMetas',
                restful_api,
                request_serializer=pb_event.User.SerializeToString,
                response_deserializer=pb_event.FileSet.FromString,
            )
            response = func(request)
        print(response)
        # create thread to run
        # create stub
        # Run method
        # if all pre[i].status == "Done":
        #     execute (self)
        #     self.status = "Done"
        # else:
        #     self.status = "Waiting"
    def monitor_status(self):
        # check if all pre[] finished
        # if all pre[] finished: self.states = "Ready"
        pass



user = pb_event.User(username='lc-host')

node = Node(name='lc-host', service_name='JournalEvents', method_name='GetFileMetas', input_type='User', input_value=user.SerializeToString())
node.execute()


python-获取类名和方法名,动态创建类和方法及属性 - 南方的墙 - 博客园

 1.在函数外部获取函数名称,用func.__name__获取
  2.在函数内部获取当前函数名称,用sys._getframe().f_code.co_name方法获取
  3.使用inspect模块动态获取当前运行的函数名,return inspect.stack()[1][3]需要封装个方法在被测函数中调用
  4.在类内部获取类名称self.__class__.__name__

import inspect,sys
def get__function_name():
    #获取正在运行函数(或方法)名称
    return inspect.stack()[1][3]
def shuzf():
    print(sys._getframe().f_code.co_name)
    print(get__function_name())

动态创建类和方法及属性

  1.使用type动态创建类
  type('child_example', (class_example,), {'echo': echo}) #(类名,继承,属性)
  type() #可以被用来动态创建class,这是因为实际上type是一个metaclass

def __init__(self,name,age):
    self.name = name
    self.age = age
Dog_class = type("Dog",(object,),{"role":"dog","__init__":__init__})   #动态添加属性与方法

d = Dog_class('shuzf',22)
print(type(Dog_class))   
print(type(d))
print(d.role,d.name,d.age)
out:
<class 'type'>
<class '__main__.Dog'>
dog shuzf 22

  2.使用setattr() 动态创建方法、属性
class A():
    name = 'python'
    @classmethod
    def funcmethod(cls):
        return 'Hello world:funcmethod'

setattr(A, 'age',30)  #创建变量并赋值,可在下次直接使用
setattr(A,'funcmethod_class',A.funcmethod) #创建变量并赋值方法

 

获取函数信息

import inspect
#函数信息
def test1():
    pass
print("函数信息:",inspect.getfullargspec(test1))

#函数的入参出参信息
def test2(a:"描述",b:object,c:int=None,d:str='http') -> str:
    print("函数的入参出参信息:",test2.__annotations__)
test2(a=1,b='2')

ICC II 时钟树综合(CTS)前奏:从约束定义到NDR规则的全方位设置指南 本文详细介绍了ICC II中时钟树综合(CTS)的前期准备工作,包括约束定义、NDR规则设置和时钟平衡点控制等关键步骤。通过实际案例和代码示例,指导工程师如何优化时钟偏斜、插入延迟和信号质量,确保芯片设计的时序收敛和性能稳定。特别强调了非默认布线规则(NDR)在时钟网络设计中的重要性。 阅读详情

相关推荐

DDR March系列算法整理

一

不吃鱼的猫的博客 1万+

Python3序列化

代码: #! /usr/bin/env python -- coding: utf-8 -- import simple_pb2 为 SimpleMessage 填充数据 sims = simple_pb2.SimpleMessage() sims.lucky_number = 6 对数据进行序列化 data = sims.SerializeToString() 对已经序列化的数据进行反序列化 t...

weixin_41217899的博客 419

直线型一阶倒立摆1---从理论到实践的桥梁

本文深入探讨了直线型一阶倒立摆在控制理论中的核心地位,从非线性控制、鲁棒性到实时反馈等关键问题。通过实际案例和硬件搭建指南,帮助读者理解从理论到实践的过渡,特别适合控制工程初学者和研究人员。文章还提供了算法选型建议和硬件避坑手册,是掌握倒立摆控制的实用指南。

weixin_29047545的博客 316

Python神经网络5之数据读取2

Python神经网络5之数据读取2数据读取TFRecordsTFRecords文件案例:CIFAR10数据存入TFRecords文件 数据读取 TFRecords TFRecords文件 TFRecords其实是一种二进制文件,虽然不如其他格式好理解,但是能够更好的利用内容,更方便复制和移动,并且不需要单独的标签文件 使用步骤: 1.获取数据 2.将数据填入到Example协议内存块(protocol buffer) 3.将协议内存块序列化为字符串,并且通过tf.python_io.TFRecordWrit

qq_34306228的博客 1619

【Ragflow】9.问答为什么比搜索响应慢?从源码角度深入分析

前几天看到有群友提到一个现象:Ragflow的搜索界面的问答速度很快,但聊天界面的问答速度很慢,究竟是什么原因?在深入挖掘源码之后,逐渐发现了问题的答案。

兴趣使然的创作者 2897

F5高可用HA配置详情

F5 HA详细配置

weixin_45843944的博客 3021

Python动态创建类

动态创建类是Python中一项极其强大而灵活的功能,它为开发者提供了强大的工具,可以根据需求动态生成类或在运行时修改类的结构。本文涵盖了type()函数、元类、namedtuple与动态类的结合,以及类装饰器的应用,展示了动态创建类的多种途径和灵活性。

Saki_Python的博客 1144

LMI线性矩阵不等式之非线性变量处理

​ 如果一个LMI线性矩阵不等式中的某项存在两个矩阵变量相乘,那么称该类情形为非线性矩阵不等式,而要直接求解时很困难的,而且LMI工具箱也无法求解非线性矩阵,所以需要通过变量替换法进行处理。 ​...

Mr.邹的博客 4549

Python序列化和反序列化

在Python中,序列化(Serialization)和反序列化(Deserialization)是处理对象数据的过程,主要用于对象的存储或网络传输。

默默的博客 2009

S-function入门及案例详解(1)——S-function基础介绍及基本案例

本专题将用三篇文章对S-function进行介绍及其案例详解。欢迎关注~ 目录一、S-Function简介二、详解sfuntmpl函数2.1 sfuntmpl函数介绍2.2 mdlInitializeSizes函数2.3 mdlDerivatives函数2.4 mdlUpdate函数2.5 mdlOutputs函数2.6 mdlGetTimeOfNextVarHit函数2.7 mdlTerminate函数三、案例1——对波形的幅值进行放大3.1 案例分析3.2 案例详解3.3 输出波形四、案例2——对波形的

Wendy的博客 7万+

从零构建爬虫抓取故宫数字文物库:Python最新实战技术详解

熟悉了动态内容加载的网页结构解析技巧。掌握了 Playwright + BeautifulSoup 的组合用法。实现了从网页→JSON→详情→图像的完整数据闭环。掌握了结构化保存与可视化分析能力。

2201_76125261的博客 1304

python的字节串bytes和字符串(以及转义字符的效果)

事情的起源是出于加深protobuf理解的目的想深入的研究下pb的编码规则。为此有如下实例: message Test { required int32 num1 = 1; required fixed32 num2 = 2; } 对这个结构实例化一个对应num1和num2分别赋值10 和1073741824 。链接中输出序列化后的16进制表示为和2进制表示如下: 十六进制表示为: 080a 1500 0000 40 二进制表示为: 0000‭10000000101000010..

mijichui2153的博客 2474

MobileViT替换YOLOv11主干网络:轻量化新思路-(用MobileViT等轻量视觉Transformer降低计算成本)

在计算机视觉领域,目标检测一直是核心任务之一,而YOLO(You Only Look Once)系列算法因其出色的速度-精度平衡成为工业界和学术界的热门选择。随着YOLOv11的推出,模型性能达到了新的高度,但其计算复杂度和参数量也随之增加,这对资源受限的移动设备和嵌入式系统提出了挑战。与此同时,视觉Transformer(ViT)的出现为计算机视觉带来了全新范式,但其庞大的计算需求限制了在移动端的应用。MobileViT作为一种创新的轻量级视觉Transformer架构,巧妙结合了CNN的归纳偏置优势和V

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1646

Python动态构造类:借助强悍的内建 type()

内建的 type() 函数带三个参数时, 将作为强悍的动态类构造器. 如下: type(name, bases, dict) 返回一个新的type对象. 基本上是 class 语句的动态形式. 参数: name , 字符串, 制定要构造类的名字, 赋给新对象的 __name__ 属性; bases,一个tuple,指定新类型的所有基类,赋给新对象的__bas...

weixin_30950607的博客 59

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Python的type函数与元类在运行时动态创建类的高级技巧

type函数不仅是查看对象类型的工具,更是动态创建类的关键。元类作为"类的类",通过继承type实现。当定义类时指定metaclass参数,Python会调用元类的__new__和__init__方法进行类构造。例如Django的模型系统就利用元类将数据库字段声明转换为实际的类属性。type函数与元类机制正是实现这一魔法的核心工具,它们允许开发者在程序运行期间灵活地生成和修改类定义。建议遵循三个原则:缓存重复创建的类、使用显式命名而非动态生成、为元类添加清晰的__repr__。

ngfvuz_216的博客 146

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python元类单例_Python元类(metaclass)以及元类实现单例模式

这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译。一、理解类也是对象在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍...

weixin_39989973的博客 154

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

构造类的方法

构造类的方法 方法一:class 1 class Foo(): 2 pass 方法二: type 构造类 def __init__(self,a): self.a = a def func1(self,b): print(self.a,"<<<<func1") print(b,...

avz72927的博客 260

python type创建类_使用 type() 动态创建类

因为类也是对象,所以我们可以在程序运行的时候创建类。Python 是动态语言。动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。在之前,我们先了了解下 type() 函数。首先我们新建一个 hello.py 的模块,然后定义一个 Hello 的 class ,classHello(object):defhello(self,name='Py'):pri...

weixin_39908462的博客 309

Python的动态添加属性与方法

我们都知道Python是动态语言。 动态?动态在哪里呢? 假如C语言定义了一个类,我们在类固定的情况下,可以不可以为这个类或者这个类的对象添加对象呢?答案肯定是否定的 Python就可以。下面我们来看看。 一.动态添加属性 1.动态添加对象属性 我们来新建一个类。 我们建立了一个Person类,用Person类生成了一个对象 xiaoming有2个属性,一个属性是姓名,一个属性是年龄 这两个属性...

Now do it 1538

python入门学习记录之元类type和metaclass的使用

引言:众所周知 python是解释型语言,亦是动态语言,解释型语言和编译型语言的不同在于函数和类的定义是在运行时创建的。 例如有一个user.py和class user(object):,python解释器就会在载入该user.py模块时依次执行,动态创建user类对象 一:python有一个type()函数:该函数的作用可以查看一个类型或变量的类型: type(user):type cla...

msdengxw的博客 686

python 动态语言的设计模式_为何大量设计模式在动态语言中不适用?

有些设计模式仅仅是为了克服静态语言的缺点而存在==========================================划个重点“有些”,原文中也说了,23个pattern中的16个,说明还有7个是适用的。其他的也并不是不适用,而是有更简单的设计,通常是直接使用类或者callable来代替接口。而且相同的问题在动态语言当中往往可以有多得多的设计方式,不同设计方式有不同的特点和优劣,并没有...

weixin_39851918的博客 117

Python:类对象

需要注意的是,该字典是类体执行期间的工作空间,它会作为参数传递给元类,用于构造类对象的属性字典,但它本身并不等同于最终类对象的。这里的 type 并非“特殊构造器”,而是一个普通的类对象(元类),其职责是:根据类名、基类与属性字典,构造一个新的类对象。这并非比喻,而是 Python 对象模型的直接结论:类与实例一样,具有身份、类型和值,并完整参与运行时的对象协议。理解类对象,不仅是正确使用类与实例的基础,更是深入理解元类、装饰器以及 Python 框架设计思想的前提条件。

qq_41176800的博客 690

<span class=“js_title_inner“>Python:类对象</span>

需要注意的是,该字典是类体执行期间的工作空间,它会作为参数传递给元类,用于构造类对象的属性字典,但它本身并不等同于最终类对象的。这里的 type 并非“特殊构造器”,而是一个普通的类对象(元类),其职责是:根据类名、基类与属性字典,构造一个新的类对象。这并非比喻,而是 Python 对象模型的直接结论:类与实例一样,具有身份、类型和值,并完整参与运行时的对象协议。理解类对象,不仅是正确使用类与实例的基础,更是深入理解元类、装饰器以及 Python 框架设计思想的前提条件。

qq_41176800的博客 897

研究Python中的元类

动态的创建类 1. 通过函数 return class 动态的构建需要的类 def choose_class(name): if name == 'foo': class Foo: pass return Foo else: class Bar: pass return Bar MyClass = choose_class('foo') print(MyClass...

itpedestrian的博客 166

python中的类怎样理解_python中元类(metaclass)的理解

一:类也是对象类就是一组用来描述如何生成一个对象的代码。类也是一个对象,只要你使用关键字class,python解释器在执行的时候就会创建一个对象。下面这段代码:classObjectCreator(object):pass会在内存中创建一个对象,名字就是ObjectCreator,这个对象(类)自身拥有创建对象(类实例)的能力。类的本质是一个对象,你可以拷贝它,可以将它赋给一个变量,将它作为参数...

weixin_39944515的博客 136
上一篇: request.files.getlist
下一篇: 通过服务名称 远程调用服务
令羽飞飞
博客等级 码龄14年 42粉丝 166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值