从方法列表中改善Python动态类方法
我需要一些帮助才能改善此类,当然,如果有的话。
我的课程剂量是基于类中定义的数组动态创建一组方法类的。
我使用此字符串来使eval函数动态创建我的方法,
add_method_str = '''
global property_method
@property
def {function_name_capitaized}(self):
return self._{function_name}
#
property_method = {function_name_capitaized}
global add_method
def add{function_name_capitaized}(self, v, rule=True):
self._{function_name}[v._name] = (v, rule)
self.markChanged()
add_method = add{function_name_capitaized}
#
global get_names_method
def get{function_name}Names(self):
return list(self._{function_name}.keys())
get_names_method = get{function_name}Names
#
global remove_method
def remove{function_name_capitaized}(self, name):
if name in self.get{function_name_capitaized}Names():
del self._{function_name}[name]
self.markChanged()
remove_method = remove{function_name_capitaized}
#
global get_method
def get{function_name_capitaized}(self, name):
if name in self._{function_name}:
return self._{function_name}[name]
raise ValueNot("{function_name} " + name + " not in object")
get_method= get{function_name_capitaized}
#
global update_method
def update{function_name_capitaized}Rule(self, name, rule):
if name in list(self._{function_name}.keys()):
obj, _oldRule = self._{function_name}[name]
self._{function_name}[name] = (obj, rule)
self.markChanged()
update_method = update{function_name_capitaized}Rule
'''
class Parameter(object):
def __init__(self, name):
self._name=name
这是类的定义
class Base(object):
def __init__(self):
self._prop = {'parameters': 'entity_type_parameter',
'functions': 'entity_type_function'}
self.dinamic_method()
def markChanged(self):
print("Changed")
def dinamic_method(self):
for name, value in self._prop.items():
setattr(self, "_"+name, {})
exec(add_method_str.format(function_name=name,
function_name_capitaized=name.capitalize()))
setattr(self.__class__, "add" + name.capitalize(), add_method)
setattr(self.__class__, "get" + name.capitalize() + "Names", get_names_method)
setattr(self.__class__, "remove"+ name.capitalize(), remove_method)
setattr(self.__class__, "get"+ name.capitalize(), get_method)
setattr(self.__class__, "update"+ name.capitalize() + "Rule", update_method)
setattr(self.__class__, name.capitalize(), property_method)
b=Base()
p=Parameter("test_p")
b.addParameters(p)
print(b.Parameters)
print(b.getParametersNames())
print(b.getParameters("test_p"))
b.updateParametersRule("test_p", False)
print(b.getParameters("test_p"))
b.removeParameters("test_p")
print(b.getParametersNames())
I need some help in order to improve this class, of course if there is any ..
What my class dose is to dynamically create a set of method class based on an array defined in the class.
I use this string in order to make the eval function to create dynamically my method
add_method_str = '''
global property_method
@property
def {function_name_capitaized}(self):
return self._{function_name}
#
property_method = {function_name_capitaized}
global add_method
def add{function_name_capitaized}(self, v, rule=True):
self._{function_name}[v._name] = (v, rule)
self.markChanged()
add_method = add{function_name_capitaized}
#
global get_names_method
def get{function_name}Names(self):
return list(self._{function_name}.keys())
get_names_method = get{function_name}Names
#
global remove_method
def remove{function_name_capitaized}(self, name):
if name in self.get{function_name_capitaized}Names():
del self._{function_name}[name]
self.markChanged()
remove_method = remove{function_name_capitaized}
#
global get_method
def get{function_name_capitaized}(self, name):
if name in self._{function_name}:
return self._{function_name}[name]
raise ValueNot("{function_name} " + name + " not in object")
get_method= get{function_name_capitaized}
#
global update_method
def update{function_name_capitaized}Rule(self, name, rule):
if name in list(self._{function_name}.keys()):
obj, _oldRule = self._{function_name}[name]
self._{function_name}[name] = (obj, rule)
self.markChanged()
update_method = update{function_name_capitaized}Rule
'''
class Parameter(object):
def __init__(self, name):
self._name=name
this is the definition of the class
class Base(object):
def __init__(self):
self._prop = {'parameters': 'entity_type_parameter',
'functions': 'entity_type_function'}
self.dinamic_method()
def markChanged(self):
print("Changed")
def dinamic_method(self):
for name, value in self._prop.items():
setattr(self, "_"+name, {})
exec(add_method_str.format(function_name=name,
function_name_capitaized=name.capitalize()))
setattr(self.__class__, "add" + name.capitalize(), add_method)
setattr(self.__class__, "get" + name.capitalize() + "Names", get_names_method)
setattr(self.__class__, "remove"+ name.capitalize(), remove_method)
setattr(self.__class__, "get"+ name.capitalize(), get_method)
setattr(self.__class__, "update"+ name.capitalize() + "Rule", update_method)
setattr(self.__class__, name.capitalize(), property_method)
b=Base()
p=Parameter("test_p")
b.addParameters(p)
print(b.Parameters)
print(b.getParametersNames())
print(b.getParameters("test_p"))
b.updateParametersRule("test_p", False)
print(b.getParameters("test_p"))
b.removeParameters("test_p")
print(b.getParametersNames())
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论