python 调用dll类作用域_作用域 - 我想在python用exec动态执行某些语句,动态定义一个类并随后调用这个类,但是出现了问题。...

问 题

问题的描述

现在有一个需求,就是python中使用字符串动态定义一个类,并随后使用其中的方法。

可以运行的代码

# /test.py

# coding=utf-8

content = '''

class MyClass:

def __init__(self):

self.name = None

self.age = None

def do():

return MyClass()

'''

exec content

print do()

# 或者最后一句话改成exec("print do()")

直接运行这段代码是没有问题的,得到了输出<__main__.myclass instance at>。

不可以运行的代码

首先定义另一个actor.py文件:

# /actor.py

# coding=utf-8

def execute(content):

exec content

return do()

然后定义test.py文件:

# /test.py

# coding=utf-8

import actor

content = """

class MyClass:

def __init__(self):

self.name = None

self.age = None

def do():

return MyClass()

"""

print actor.execute(content)

运行test.py文件,会出现NameError: global name 'MyClass' is not defined。

我的需求就是,定义一个模块,在这个模块的函数中执行一段指定的字符串,动态定义一个类,并且需要调用这个类,现在遇到的问题如上所示,求助啊。。。

解决方案

首先“exec”是不被推荐的方法,因为它会带来一些问题:

一些基于__module__属性的模块会失败,比如pickle,inspect,pydoc等

内存泄漏

namespace和module shutdown behavior issue

既然你硬要这么做的话,下面代码可以提供一点参考:

tester.py

# encoding: utf-8

# tester.py

import actor

content = """

class MyClass:

def __init__(self):

self.name = None

self.age = None

def do():

return MyClass()

"""

vars = {}

code = compile(content, '', 'exec')

m_cls = actor.execute(code, vars, vars)

print m_cls.name

actor.py

# encoding: utf-8

# actor.py

def execute(content, m_globals, m_locals):

exec(content, m_globals, m_locals)

return m_globals['do']()

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值