python – 从默认参数设置类属性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 从默认参数设置类属性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1760字,纯文字阅读大概需要3分钟。
内容图文
![python – 从默认参数设置类属性](/upload/InfoBanner/zyjiaocheng/736/c2ff8e96e39b4539bd8b90a3b8652777.jpg)
我想自动将默认参数设置为类属性.
例如,我有(有更多的参数,比如十几个或两个):
class Foo:
def __init__(self,a=1,b=2,c=3,...):
self.a = a
self.b = b
self.c = c
...
我想自动定义属性,而不必在__init__体中一直重写self.x = x.
我可以使用类似的东西:
class Foo:
def __init__(self, **kwargs):
for attr, value in kwargs.items():
setattr(self,attr,value)
但是现在我不能给它们默认值.
我想要的是一些函数,它给我一个默认值的参数字典:
class Foo:
def __init__(self,a=1,b=2,c=3,...,**kwargs):
defargs = somefunction()
defargs为{‘a’:1,’b’:2,’c’:3,…}(但不包含kwargs).
我设法做的最近的事情是:
class Foo:
def __init__(self,a=1,b=2,c=3,...,**kwargs):
defargs=locals()
defargs.pop('self')
defargs.pop('kwargs')
for attr, value in defargs.items():
setattr(self,attr,value)
但是我不知道这段代码中是否存在一些潜在的不安全行为.
解决方法:
在Python 3.3中,这可以使用inspect.signature轻松完成:
import inspect
def auto_assign(func):
signature = inspect.signature(func)
def wrapper(*args, **kwargs):
instance = args[0]
bind = signature.bind(*args, **kwargs)
for param in signature.parameters.values():
if param.name != 'self':
if param.name in bind.arguments:
setattr(instance, param.name, bind.arguments[param.name])
if param.name not in bind.arguments and param.default is not param.empty:
setattr(instance, param.name, param.default)
return func(*args, **kwargs)
wrapper.__signature__ = signature # Restore the signature
return wrapper
class Foo:
@auto_assign
def __init__(self, foo, bar, a=1, b=2, c=3):
pass
f = Foo(10, 20)
g = Foo(100, 200, a=999)
print(f.__dict__)
print(g.__dict__)
print(inspect.getargspec(Foo.__init__))
输出:
{'bar': 20, 'b': 2, 'foo': 10, 'c': 3, 'a': 1}
{'bar': 200, 'b': 2, 'foo': 100, 'c': 3, 'a': 999}
ArgSpec(args=['self', 'foo', 'bar', 'a', 'b', 'c'], varargs=None, keywords=None, defaults=(1, 2, 3))
内容总结
以上是互联网集市为您收集整理的python – 从默认参数设置类属性全部内容,希望文章能够帮你解决python – 从默认参数设置类属性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。