Qua*_*ool 9 python constructor initialization class decorator
我已经厌倦了在我的__init__
功能中不断地一遍又一遍地输入相同的重复命令.我想知道我是否可以写一个装饰师为我做这项工作.这是我的问题的一个例子:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以让我自动将所有传递给函数的参数变成具有相同名称的实例变量?例如:
class Point:
@instance_variables
def __init__(self, x, y):
pass
Run Code Online (Sandbox Code Playgroud)
哪里@instance_variables
会自动设置self.x = x
和self.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
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
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
Run Code Online (Sandbox Code Playgroud)