作用域 - 我想在python用exec动态执行某些语句,动态定义一个类并随后调用这个类,但是出现了问题。
ringa_lee
ringa_lee 2017-04-18 10:05:37
0
2
556

问题的描述

现在有一个需求,就是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_lee
ringa_lee

ringa_lee

全員に返信(2)
Peter_Zhu

まず第一に、「exec」はいくつかの問題を引き起こすため、推奨される方法ではありません:

  • __module__ 属性に基づく一部のモジュール (pickle、inspect、pydoc など) は失敗します。

  • メモリリーク

  • 名前空間とモジュールのシャットダウン動作の問題

これらの問題の詳細な説明については、http://lucumr.pocoo.org/2011/...

を参照してください。

どうしてもこれを実行したい場合は、次のコードが参考になります:

  • tester.py

リーリー
  • actor.py

リーリー
いいねを押す +0
大家讲道理

クラスを動的に作成する

リーリー

Python の高度な機能に慣れていないため、exec の使用を検討することになるでしょう

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!