gpt4 book ai didi

python - 区分python函数和类函数

转载 作者:太空宇宙 更新时间:2023-11-03 14:15:19 24 4
gpt4 key购买 nike

我试图找出如何区分 python 模块级函数和尚未绑定(bind)到对象实例的方法。当函数是一个未绑定(bind)的实例方法时,我需要一个定义该方法的类的句柄。 inspect.ismethod() 不起作用,因为该方法尚未绑定(bind)到对象实例。 type() 为模块级函数和未绑定(bind)方法返回“函数”。

用例是一个使用方法和函数装饰器的插件框架。我有一个通用的“模型”类,可以对其进行子类化以添加功能。插件“ Action ”在子类中使用 @register_action( name ) 装饰器定义。装饰器函数在导入时被调用以注册操作。然后 gui 为字典中的每个 ACTION 添加菜单项——但是如果 gui 的模型类是注册函数/方法的类的实例,则 gui 应该只添加一个操作。

下面是一些示例代码。现在我的解决方案是解析 fcn 描述符的文本,然后检查 class_str == str( model.__class__ ).split('.')[-1].strip("'>")。我还尝试将 SpecialModel 传递给装饰器,但装饰器函数运行时未定义 SpecialModel,因此不起作用。必须有更好的解决方案来注册类方法操作。

注意:由于 SpecialMethod 没有定义,所以不可能将 SpecialMethod 传递给 register_action 装饰器,我可能需要调用 get_class_from_function 当需要向 gui 注册一个 Action 时。

ACTIONS = dict()

### HACK -- best I could do, but want actual Class, not class_name ###
# FIXME : want to return None, Model, SpecialModel, etc.
def get_class_from_function( fcn ):
qname = fcn.__qualname__.split( '.' )
if len( qname ) > 1: # this is (likely) a class function
cls_name = qname[0]
return cls_name
else:
return None

def register_action( name ):
def register_decorator( fcn ):
global ACTION
cls = get_class_from_function( fcn )
ACTION[ name ] = ( fcn, cls )
return fcn
return register_decorator

@register_action( "Help/About" )
def help_about_function( model ):
pass

class Model( object ):
def __init__( self ):
pass

@register_action( "File/Load" )
def load( self ):
pass

class SpecialModel( Model ):
@register_action( "Special/Custom Action" )
def specialact( self ):
pass

最佳答案

我认为您可以使用这样的装饰器来实现您的最终目标:

def register_action( name ):
def register_decorator( fcn ):
fcn._action_name = name
return fcn
return register_decorator

然后稍后在您的 gui 代码中当您实际拥有对象实例时,遍历其实例方法并查找任何带有 _action_name 的方法并为其创建特定于 gui 的代码:

for method_name, method in inspect.getmembers(my_specific_instance, predicate=inspect.ismethod):
if hasattr(method, '_action_name'):
add_to_gui_menu(method._action_name, method)

关于python - 区分python函数和类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33880463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com