大佬教程收集整理的这篇文章主要介绍了动态地将方法添加到类 _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,请注明来意。