Rumah > Soal Jawab > teks badan
现在有一个需求,就是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
。
我的需求就是,定义一个模块,在这个模块的函数中执行一段指定的字符串,动态定义一个类,并且需要调用这个类,现在遇到的问题如上所示,求助啊。。。
天蓬老师2017-04-18 10:07:37
Pertama sekali "exec" bukanlah kaedah yang disyorkan kerana ia akan menyebabkan beberapa masalah:
Sesetengah modul berdasarkan atribut __module__ akan gagal, seperti pickle, inspect, pydoc, dll.
Memori bocor
ruang nama dan isu tingkah laku penutupan modul
Untuk penerangan terperinci tentang isu ini, sila rujuk: http://lucumr.pocoo.org/2011/...
Jika anda berkeras untuk melakukan ini, kod berikut boleh memberikan beberapa rujukan:
penguji.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, '<string>', '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']()
大家讲道理2017-04-18 10:07:37
Buat kelas secara dinamik
def init(self, name):
self.name = name
attrs = dict(name=None, age=None, __init__=init )
# type创建一个类, base object, 设置属性和__init__等
klass = type("MyClass", (object, ), attrs)
my = klass(name="Hello")
print(my) # <__main__.MyClass object at 0x10b882290>
print(my.name) # Hello
Anda akan mempertimbangkan untuk menggunakan exec, mungkin kerana anda tidak terdedah kepada ciri lanjutan python