从方法列表中改善Python动态类方法

发布于 2025-02-04 11:13:58 字数 2833 浏览 2 评论 0原文

我需要一些帮助才能改善此类,当然,如果有的话。

我的课程剂量是基于类中定义的数组动态创建一组方法类的。

我使用此字符串来使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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文