python 动态构造类 type

这篇博客介绍了在Python中如何使用getattr动态获取类并实例化,以及利用globals()和setattr()动态创建和调用类方法。还展示了如何通过type动态创建类,并利用inspect模块获取函数信息。此外,文章讨论了如何在类中监控状态以及线程安全的实现。

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')

### Python 类的构造方法 `__init__` 使用教程 #### 什么是构造方法? 在 Python 中,`__init__` 是一种特殊的类方法,称为构造方法。当通过类创建一个新的实例时,该方法会被自动调用[^2]。它的主要功能是对新创建的对象进行初始化操作。 #### 构造方法的基本结构 以下是 `__init__` 方法的一般形式: ```python class MyClass: def __init__(self, param1, param2): self.param1 = param1 self.param2 = param2 ``` 在这个例子中,`param1` 和 `param2` 是传递给构造方法的参数。这些参数可以用来设置对象的状态或属性。注意,第一个参数总是 `self`,它代表当前被创建的实例本身。 #### 如何使用 `__init__` 下面展示了一个具体的例子,说明如何定义并使用带有 `__init__` 的类: ```python class Person: def __init__(self, name, age, phone_number): self.name = name self.age = age self.phone_number = phone_number def introduce(self): return f"My name is {self.name}, I am {self.age} years old." # 创建一个Person类的实例 person_instance = Person("麻花藤", 31, "10086") # 访问实例变量和方法 print(person_instance.introduce()) # 输出: My name is 麻花藤, I am 31 years old. ``` 上述代码展示了如何利用 `__init__` 初始化一个具有特定状态的新对象,并且还演示了访问这个对象的方法[^4]。 #### 深入理解 `__new__` 和 `__init__` 需要注意的是,在实际创建对象的过程中,除了 `__init__` 外还有一个叫做 `__new__` 的方法也参与其中。具体来说,`__new__` 负责创建新的实例,而 `__init__` 则负责对该实例进行初始化[^3]。通常情况下开发者不需要重写 `__new__`,除非是在实现自定义元类或者不可变数据类型的场景下。 #### 示例:手动模拟实例化过程 为了更清楚地看到这两个阶段的区别,这里给出了一种方式来手动模拟实例化的整个流程: ```python def create_instance(cls, *args, **kwargs): instance = object.__new__(cls) # 手动执行__new__ cls.__init__(instance, *args, **kwargs) # 显式调用__init__ return instance # 返回已初始化完成的实例 # 测试上面定义的功能 MyClass = type('MyClass', (object,), {'__init__': lambda self, value: setattr(self, 'value', value)}) my_obj = create_instance(MyClass, 42) print(my_obj.value) # 应打印出42 ``` 此段脚本不仅验证了理论上的知识点,同时也提供了实践层面的操作指南[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值