别名是要从init方法分配的类函数

时间:2019-03-19 09:30:42

标签: python alias

鉴于我有一个课程,例如:

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

2 个答案:

答案 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__