假设我正在声明一个类C
,其中一些声明非常相似。我想使用一个函数f
来减少这些声明的代码重复。f
可以像往常一样声明和使用:
>>> class C(object):
... def f(num):
... return '<' + str(num) + '>'
... v = f(9)
... w = f(42)
...
>>> C.v
'<9>'
>>> C.w
'<42>'
>>> C.f(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with C instance as first argument (got int instance instead)
哎呀!我无意中接触f
到了外界,但这不需要self
争论(并且不能出于明显的原因)。一种可能性是del
我使用该功能后:
>>> class C(object):
... def f(num):
... return '<' + str(num) + '>'
... v = f(9)
... del f
...
>>> C.v
'<9>'
>>> C.f
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'C' has no attribute 'f'
但是如果我想f
在声明之后再次使用呢?删除该功能是不行的。我可以将其设为“私有”(即,在其名称前加上__
)并对其进行处理,但通过异常通道@staticmethod
调用对象变得非常时髦:staticmethod
>>> class C(object):
... @staticmethod
... def __f(num):
... return '<' + str(num) + '>'
... v = __f.__get__(1)(9) # argument to __get__ is ignored...
...
>>> C.v
'<9>'
我必须使用上述疯狂staticmethod
,因为作为描述符的对象本身不可调用。我需要恢复被staticmethod
对象包裹的函数,然后才能调用它。
必须有更好的方法来做到这一点。如何在类中干净地声明一个函数,在其声明期间使用它,以及稍后在类中使用它?我应该这样做吗?