当前位置: 首页 > 面试题库 >

Python装饰器自动定义__init__变量

狄雅珺
2023-03-14
问题内容

我受够了在__init__函数中不断重复输入相同的重复命令。我想知道我是否可以写一个装饰器为我做这项工作。这是我的问题的一个示例:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

有什么方法可以自动将所有传递给函数的参数变成具有相同名称的实例变量?例如:

class Point:
    @instance_variables
    def __init__(self, x, y):
        pass

哪里@instance_variables会自动设置self.x = xself.y = y。我该怎么办?
谢谢!

编辑:我应该提到我使用CPython 2.7。


问题答案:

这是我第一次尝试装饰器:

编辑第二尝试:我添加了处理变量的默认值和检查有效的关键字。

[编辑3:添加的默认检查不是“无”。

def instanceVariables(func):
    def returnFunc(*args, **kwargs):
        selfVar = args[0]

        argSpec = inspect.getargspec(func)
        argumentNames = argSpec[0][1:]
        defaults = argSpec[3]
        if defaults is not None:
            defaultArgDict = dict(zip(reversed(argumentNames), reversed(defaults)))
            selfVar.__dict__.update(defaultArgDict)

        argDict = dict(zip(argumentNames, args[1:]))
        selfVar.__dict__.update(argDict)


        validKeywords = set(kwargs) & set(argumentNames)
        kwargDict = {k: kwargs[k] for k in validKeywords}
        selfVar.__dict__.update(kwargDict)

        func(*args, **kwargs)

    return returnFunc

这是一个例子:

class Test():

    @instanceVariables
    def __init__(self, x, y=100, z=200):
        pass

    def printStr(self):
        print(self.x, self.y, self.z)

a = Test(1, z=2)

a.printStr()

>>> 1 100 2


 类似资料:
  • Nest 是基于 装饰器 这种语言特性而创建的。在很多常用的编程语言中 装饰器 都是一个很大众的概念,但在 JavaScript 语言中这个概念却比较新。所以为了更好地理解装饰器是如何工作的,你应该看看 这篇 文章。下面给出一个简单的定义: ES2016 的装饰器是一个可以将目标对象,名称和属性描述符作为被修饰方法(returns function)的参数的表达式。你可以通过装饰器前缀 @ 来使用

  • 问题内容: 我正在使用django和celery(django-celery)进行项目。我们的团队决定将所有数据访问代码包装在其中(不要像django这样包装到Manager中),而将代码放入(应用程序名称)中,仅处理用celery组装和执行任务(因此我们没有django在这一层的ORM依赖性)。 在我的,我有这样的事情: 在我的中,我喜欢将它们包装成任务(然后可以使用这些任务来完成更复杂的任务)

  • 问题 你想写一个装饰器来包装一个函数,并且允许用户提供参数在运行时控制装饰器行为。 解决方案 引入一个访问函数,使用 nonlocal 来修改内部变量。 然后这个访问函数被作为一个属性赋值给包装函数。 from functools import wraps, partial import logging # Utility decorator to attach a function as an

  • 问题内容: 我是Python装饰器的新手(哇,很棒的功能!),并且我很难使以下内容起作用,因为参数混杂在一起。 运行此命令时,我得到: 我做的那条线 问题 -显然,问题在于缓存器对象而不是Session实例,而该实例实际上没有属性。但是我找不到解决方法。 我已经考虑过但不能使用的解决方案 -我想到使decorator类返回一个函数而不是一个值(如本文的2.1节),以便在正确的上下文中进行评估,但这

  • 问题内容: 我正在尝试学习装饰器。我了解它的概念,现在尝试实现它。 这是我编写 的代码,代码不言自明。它只是检查参数是否传入。 抛出错误的说法。我了解它未在下定义,但不知道如何纠正此代码?我要去哪里错了? 问题答案: 您的装饰器应如下所示: 需要注意的几点: 期望将类作为第一个参数(您可以将其替换为简单的try / except TypeError除外)。 包装器应返回一个函数,而不是被调用函数的

  • 问题内容: 问题 我希望某些观点仅适用于网站的高级用户。 在项目中的各种应用程序中如何使用此装饰器? 问题答案: 你不必为此编写自己的装饰器,就像中已经包含的那样。 还有一个扩展此装饰器的代码段(),该代码段非常适合你的用例。 而且,要(重新)使用装饰器,只需将装饰器放在路径中的模块中,即可从任何其他模块导入它。