请注意
class Foo(object): a = None
在
Foo的dict中设置一个键值对:
Foo.__dict__['a']=None
而
def __init__(self, a = None, b = None, c = None): self.a = a
在Foo实例对象的dict中设置一个键值对:
foo=Foo()foo.__dict__['a']=a
因此,在您定义的顶部设置类成员与在您定义的下半部分(位于)内实例属性的设置没有直接关系
__init__。
另外,很高兴知道这
__init__是Python的 initializer 。
__new__是类的 构造函数 。
如果您正在寻找一种基于
__init__的参数自动添加某些实例属性的方法,则可以使用以下方法:
import inspectimport functoolsdef autoargs(*include,**kwargs): def _autoargs(func): attrs,varargs,varkw,defaults=inspect.getargspec(func) def sieve(attr): if kwargs and attr in kwargs['exclude']: return False if not include or attr in include: return True else: return False @functools.wraps(func) def wrapper(self,*args,**kwargs): # handle default values for attr,val in zip(reversed(attrs),reversed(defaults)): if sieve(attr): setattr(self, attr, val) # handle positional arguments positional_attrs=attrs[1:] for attr,val in zip(positional_attrs,args): if sieve(attr): setattr(self, attr, val) # handle varargs if varargs: remaining_args=args[len(positional_attrs):] if sieve(varargs): setattr(self, varargs, remaining_args) # handle varkw if kwargs: for attr,val in kwargs.iteritems(): if sieve(attr): setattr(self,attr,val) return func(self,*args,**kwargs) return wrapper return _autoargs
所以当你说
class Foo(object): @autoargs() def __init__(self,x,path,debug=False,*args,**kw): passfoo=Foo('bar','/tmp',True, 100, 101,verbose=True)您会自动获得以下实例属性:
print(foo.x)# barprint(foo.path)# /tmpprint(foo.debug)# Trueprint(foo.args)# (100, 101)print(foo.verbose)# True
PS。尽管我写了这篇文章(出于娱乐目的),但我不建议您将其
autoargs用于认真的工作。言外之意是简单,清晰和无误的。我不能这样说
autoargs。
PPS。 是我一个人,还是许多按钮坏了?编辑器窗口丢失了所有图标… :(清除浏览器缓存可解决此问题。



