>  Q&A  >  본문

作用域 - 我想在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 0x000000000243EB88>

不可以运行的代码

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

ringa_leeringa_lee2714일 전561

모든 응답(2)나는 대답할 것이다

  • 天蓬老师

    天蓬老师2017-04-18 10:07:37

    우선 "exec"는 몇 가지 문제를 일으킬 수 있으므로 권장되는 방법이 아닙니다.

    • Pickle, Inspect, pydoc 등 __module__ 속성을 기반으로 하는 일부 모듈은 실패합니다.

    • 메모리 누수

    • 네임스페이스 및 모듈 종료 동작 문제

    이러한 문제에 대한 자세한 설명은 다음을 참조하세요: http://lucumr.pocoo.org/2011/...

    이 작업을 계속 수행하려는 경우 다음 코드를 참고할 수 있습니다.

    • tester.py

    으아아아
    • actor.py

    으아아아

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:07:37

    동적으로 수업 만들기

    으아아아

    파이썬의 고급 기능에 노출되지 않았기 때문에 exec 사용을 고려할 수도 있습니다

    회신하다
    0
  • 취소회신하다