2

我在工作中有一个框架(由被认为是我们组织中最有经验的程序员设计),它的结构是我见过的最奇怪的。该框架有很多 API,都具有相同的结构:

  • 每个 API(函数)都有一个“自我”参数,尽管它是一个简单的函数(不是类方法)
  • 这个'self'参数被添加到装饰器@incself中,实际上是对函数本身的引用
  • 在每个函数内部,所有参数都被转换为“self”对象的属性(= 函数的属性)
  • 然后,在整个函数代码中,参数以 self.arg1、self.arg2、... 的形式使用

由于显然我是唯一一个认为这很奇怪的人,请帮助我提出您的意见。你们中是否有人使用过/看到过类似的方法,它有什么可能的好处?

from functools import wraps

def incself(func):
    @wraps(func)
    def wrapper(*args, **kwds):
        return func(func, *args, **kwds)
    return wrapper

@incself
def apiFunc01(self, **kwargs):
    for key, value in kwargs.items():
        setattr(self, key, value)
    #....
    print('Connect to IP={0}, port={1}'.format(self.ip, self.port))
    #....

if __name__ == '__main__':
    # the API is called without the 'self' argument!!
    apiFunc01(ip='2.3.4.5', port=2345)

谢谢!

4

1 回答 1

0

这是一种提醒上次通话的参数的方式:

>>>apiFunc01(ip='a', port=123)
Connect to IP=a, port=123

>>>apiFunc01()
Connect to IP=a, port=123

>>>apiFunc01(ip='2.3.4.5', port=123)
Connect to IP=2.3.4.5, port=123

>>>apiFunc01()
Connect to IP=2.3.4.5, port=123
于 2014-07-11T13:42:54.200 回答