<p>属于一个类的函数有三种不同的方式:</p>
<pre><code>def _instance_method(self, *args):
print('self:', self)
print('instance_method args:', args, '\n')
def _class_method(cls, *args):
print('cls:', cls)
print('class_method args:', args, '\n')
def _static_method(*args):
print('static_method args:', args, '\n')
class TestClass:
instance_method = _instance_method
class_method = classmethod(_class_method)
static_method = staticmethod(_static_method)
</code></pre>
<p>实例方法隐式传递对实例的引用。类方法隐式传递对类的引用。实例或类都未传递静态方法。以下用法作为示例:</p>
^{pr2}$
<p>请注意,当函数在类的主体中定义时,通常使用修饰符来实现相同的结构。在</p>
<pre><code>class TestClass:
def instance_method(self, *args): pass
@classmethod
def class_method(cls, *args): pass
@staticmethod
def static_method(*args): pass
</code></pre>
<p>注意,这只是一种控制隐式传递给函数的参数的机制。这与您的情况有关,因为您有一个独立于类定义定义的函数,因此将实例或类传递给函数是没有意义的。在</p>
<p>还应该注意的是,在类定义完成之后,可以直接将函数分配给类。在</p>
<pre><code>class FunctionStore1: pass
FunctionStore1.func_to_check = func_to_check
</code></pre>
<p>我个人认为这可能是你的案子最好的模式。它清楚地表明您正在将有问题的函数作为成员数据附加到类。此模式还允许使用舒适的“没有<code>staticmethod</code>的用例”透视图。在</p>
<p>这也可以通过使用装饰器来完成。在</p>
<pre><code>def bind_function(func):
def wrapper(cls):
setattr(cls, func.__name__, func)
return cls
return wrapper
def func_to_check(*args):
print('args:', args, '\n')
@bind_function(func_to_check)
class TestClass: pass
TestClass.func_to_check('args')
# args: ('args',)
</code></pre>
<p>这是一个很好的模式,因为您可以在类定义之前声明要绑定的函数,而不是在它之后很容易错过的地方。它还提供了很多灵活性,如果你想改变事情。例如,您可以使用一个静态名称,而不是动态地使用<code>func.__name__</code>作为class属性。或者,您可以允许将多个函数传递给decorator(甚至可以委托确定参数)。在</p>