【问题标题】:Check if class instances are callable without instantiating检查类实例是否可以在不实例化的情况下调用
【发布时间】:2022-06-27 11:43:52
【问题描述】:

如何检查给定类的实例是否可调用?如果您实例化类然后使用callable(),这很容易做到。但我的问题是如何在不实例化的情况下进行检查。以Calendar 类为例:

>>> import calendar
>>> callable(calendar.Calendar())
False

我想做同样的事情但不实例化,即实现一些函数callable_class_instances() 这样:

>>> import calendar
>>> callable_class_instances(calendar.Calendar)
False
>>> 
>>> class MyFunc:
...     def __init__(self):
...         print('Should not run on callable_class_instances call.')
...     def __call__(self):
...         print('MyFunc instance called.')
>>> callable_class_instances(MyFunc)
True

有没有什么看起来不像黑客的简单方法?

【问题讨论】:

    标签: python class callable-object


    【解决方案1】:

    来自the docs

    注意类是可调用的(调用类返回一个新实例);如果类具有__call__() 方法,则可以调用实例。

    我之前的尝试 (hasattr) 的问题是所有类都有一个 __call__ 方法,以便我们可以初始化它们。这应该在大多数情况下都有效:

    >>> import types
    
    >>> import calendar
    >>> isinstance(calendar.Calendar.__call__, types.FunctionType)
    False
    

    请注意,这不适用于非 Python __call__ 实现。

    【讨论】:

    • 新尝试看起来不错。您知道任何具有非 python __call__ 实现的类吗?很高兴在这里链接到一个不起作用的示例。
    • 老实说,我在发布此内容之前进行了简短调查,但找不到任何内容。我猜基于 C 的第三方库(numpy 等)可能包含示例。
    • 感谢您的帮助。我将尝试找到一个不起作用的示例。如果我找到了会在这里评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多