python定义常量、装饰器_Python装饰器自动定义__init__变量

I've got fed up of continually typing the same, repetitive commands over and over again in my __init__ function. I was wondering if I could write a decorator to do the work for me. Here's an example of my question:

class Point:

def __init__(self, x, y):

self.x = x

self.y = y

Is there some way in which I can automatically have all arguments passed into the function become instance variables with the same names? For example:

class Point:

@instance_variables

def __init__(self, x, y):

pass

Where @instance_variables would automatically set self.x = x and self.y = y. How could I do this?

Thanks!

EDIT: I should mention that I use CPython 2.7.

解决方案

Here is my first try at the decorator:

[EDIT second try: I added handling defaults for variables and checking for valid keywords. Thanks ivan_pozdeev ]

[EDIT 3: Added check for defaults is not None]

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

Here is a example:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值