鉴于我有一个课程,例如:
class Model(object):
def __init__(self, foo = 'bar'):
if foo == 'bar':
self.f = self._sse
else:
self.f = None
def _sse():
pass
有没有一种方法可以创建别名,这样就不必检查非位置参数foo
的值了吗?像
class Model(object):
alias = {'bar': _sse}
def __init__(self, foo = 'bar'):
self.f = foo
def _sse():
pass
答案 0 :(得分:1)
技术答案:您可以通过在初始化程序之前 定义目标函数,将此函数作为默认参数(Python函数也是对象),然后在目标上手动调用描述符协议来实现功能:
>>> class Model(object):
... def _sse(self):
... print("in self._sse")
... def __init__(self, foo=_sse):
... self.f = foo.__get__(self, type(self))
...
>>> m = Model()
>>> m.f()
in self._sse
请注意,使用此解决方案时,如果要传递另一个函数,则此函数必须采用self
作为第一个参数:
>>> # doesn't work
... def bar(): print("bar")
...
>>> m2 = Model(bar)
>>> m2.f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bar() takes no arguments (1 given)
>>> # works:
... def baaz(self): print("baaz({})".format(self))
...
>>> m3 = Model(baaz)
>>> m3.f()
baaz(<__main__.Model object at 0x7fc3e2337090>)
现在从可读性POV来看,这只是IMHO的一个改进...
编辑:正如Aran-Fey所提到的那样,这并不能完全回答问题,因此对于更“文字化”的版本(不需要特殊定义排序等):
class Model(object):
def _sse(self):
print("in self._sse")
alias = {"bar": "_sse"}
def __init__(self, foo="bar"):
self.f = getattr(self, self.alias.get(foo, "___"), None)
但这仍然不能提高可读性...
答案 1 :(得分:0)
使用@KlausD。建议,并在/HQ/test_web/**
方法中包含alias
对我来说很有用。
__init__