检查 class 个实例是否可以在不实例化的情况下调用
Check if class instances are callable without instantiating
如何检查给定 class 的实例是否可调用。如果您实例化 class 然后使用 callable()
,这很容易做到。但我的问题是如何在不实例化的情况下进行检查。以 Calendar
class:
为例
>>> 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
有什么简单的方法可以做到这一点,而且看起来不像黑客?
来自the docs:
Note that classes are callable (calling a class returns a new instance); instances are callable if their class has a __call__()
method.
我之前的尝试 (hasattr
) 的问题是所有 类 都有一个 __call__
方法,以便我们可以初始化它们。这应该在大部分时间都有效:
>>> import types
>>> import calendar
>>> isinstance(calendar.Calendar.__call__, types.FunctionType)
False
请注意,这不适用于 non-Python __call__
实施。
如何检查给定 class 的实例是否可调用。如果您实例化 class 然后使用 callable()
,这很容易做到。但我的问题是如何在不实例化的情况下进行检查。以 Calendar
class:
>>> 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
有什么简单的方法可以做到这一点,而且看起来不像黑客?
来自the docs:
Note that classes are callable (calling a class returns a new instance); instances are callable if their class has a
__call__()
method.
我之前的尝试 (hasattr
) 的问题是所有 类 都有一个 __call__
方法,以便我们可以初始化它们。这应该在大部分时间都有效:
>>> import types
>>> import calendar
>>> isinstance(calendar.Calendar.__call__, types.FunctionType)
False
请注意,这不适用于 non-Python __call__
实施。