gpt4 book ai didi

Python装饰器自动定义__init__变量

转载 作者:太空狗 更新时间:2023-10-29 20:25:32 25 4
gpt4 key购买 nike

我已经受够了在我的 __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。

最佳答案

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

[编辑第二次尝试:我添加了处理变量的默认值并检查有效关键字。谢谢ivan_pozdeev ]

[编辑 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

关于Python装饰器自动定义__init__变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28443527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com