程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了动态地将方法添加到类 _without_ 在 python 中公开方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决动态地将方法添加到类 _without_ 在 python 中公开方法?

开发过程中遇到动态地将方法添加到类 _without_ 在 python 中公开方法的问题如何解决?下面主要结合日常开发的经验,给出你关于动态地将方法添加到类 _without_ 在 python 中公开方法的解决方法建议,希望对你解决动态地将方法添加到类 _without_ 在 python 中公开方法有所启发或帮助;

我有一个库,出于各种原因,我想分段构建(主要是为了我可以记录它们,处理它们并在笔记本中独立测试它们)。@H_944_3@

假设我有一个所有者类 Parse - 我想向它添加一堆静态方法。@H_944_3@

此代码有效:@H_944_3@


def _internal_parse_one_of( *List_of_possible_matches ):
    parsers = as_parsers( List_of_possible_matches )
    if len(parsers) == 0:
        raise Exception("no parsers were provIDed")
    the_whole_Expression = None
    for parser in parsers:
        the_whole_Expression = parser if the_whole_Expression is None else the_whole_Expression.or_else( parser )
    return the_whole_Expression 

Parse.one_of = _internal_parse_one_of 

Parse.one_of( "x","y","z").test_pass("xavIEr","x")
Parse.one_of( "x","z").test_pass("yellow","y")
Parse.one_of( "x","z").test_pass("zebra","z")
Parse.one_of( "x","z",Parse.any_char).test_pass("abracadabra","a")

但它泄漏这个“_internal_parse_one_of”定义到全局命名空间中。有没有什么方法可以在不泄漏任何东西的情况下实现相同的目标?@H_944_3@

解决方法

所以我的第一个粗略的答案是定义辅助函数,将其设置为 Parse 的属性,然后删除原始引用。@H_944_3@

class Test:
    def __init__(self):
        pass
        
def my_func():
    print('yay')
    
Test.my_method = my_func
del my_func


Test.my_method()

try:
    my_func()
except NameError:
    print('We don’t pollute on Stackoverflow')
,

基于@AlexNe 的回答,这里有一个函数可以将任意函数添加到任意类的命名空间,然后在全局命名空间中删除对该函数的引用。我将新方法的名称作为可选参数; assign_then_delete_from_globals 如果您不为其分配新名称,则默认使用该函数的现有名称。@H_944_3@

def assign_then_delete_from_globals(func,cls,new_func_name=''):
    old_func_name = func.__name__
    if new_func_name:
        func.__name__ = new_func_name
    else:
        new_func_name = old_func_name
    setattr(cls,new_func_name,funC)
    del globals()[old_func_name]


class Test:
    pass


def my_func():
    print('yay')


assign_then_delete_from_globals(my_func,Test,'my_method')

Test.my_method()

try:
    my_func()
except NameError:
    print('We don’t pollute on Stackoverflow')

大佬总结

以上是大佬教程为你收集整理的动态地将方法添加到类 _without_ 在 python 中公开方法全部内容,希望文章能够帮你解决动态地将方法添加到类 _without_ 在 python 中公开方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。