Пожалуйста, обратите внимание, что
class Foo(object):
a = None
задает пару ключ-значение в Словаре Foo
«s:
Foo.__dict__['a']=None
в то время как
def __init__(self, a = None, b = None, c = None):
self.a = a
задает пару ключ-значение в Foo экземпляр объекта объекта:
foo=Foo()
foo.__dict__['a']=a
Поэтому установка членов класса в верхней части вашего определения напрямую не связана с настройкой атрибутов экземпляра в нижней половине вашего определения (внутри __init__
.
Также хорошо знать, что __init__
является инициализатором Python. __new__
- класс конструктор.
Если вы ищете способ, чтобы автоматически добавить некоторые атрибуты экземпляра на основе аргументов __init__
«s, вы могли бы использовать это:
import inspect
import functools
def 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):
pass
foo=Foo('bar','/tmp',True, 100, 101,verbose=True)
вы автоматически получаете эти атрибуты экземпляра:
print(foo.x)
# bar
print(foo.path)
# /tmp
print(foo.debug)
# True
print(foo.args)
# (100, 101)
print(foo.verbose)
# True
PS. Хотя я написал это (для удовольствия), я не рекомендую использовать autoargs
для серьезной работы. Быть явным просто, ясно и непогрешимо. Я не могу сказать то же самое для autoargs
.
PPS. Это только я, или много кнопок, разбитых на Stackoverflow? Окно редактора потерял все свои иконки ... :(
Очистка кэш браузера исправили проблему.
Я также обнаружил, что подклассификация namedtuple - http://docs.python.org/dev/library/collections.html#collections.namedtuple - неплохая идея. –