Скопировать ** kwargs в себя?
Учитывая
class ValidationRule:
def __init__(self, **kwargs):
# code here
Есть ли способ, которым я могу определить __init__
таким образом, что если бы я должен был инициализировать класс с чем-то вроде ValidationRule(other='email')
, то self.other
был бы "добавлен" в класс без явного указания всех возможных kwarg?
Ответы
Ответ 1
Это может быть не самый чистый способ, но он работает:
class ValidationRule:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
Я думаю, что предпочитаю ony solution, потому что он ограничивает доступные свойства, чтобы вы не попадали в неприятности, когда ваш вход поступает из внешних источников.
Ответ 2
Я думаю, что где-то в stackoverflow я видел такое решение
В любом случае это может выглядеть так:
class ValidationRule:
__allowed = ("other", "same", "different")
def __init__(self, **kwargs):
for k, v in kwargs.iteritems():
assert( k in self.__class__.__allowed )
setattr(self, k, v)
Ответ 3
Вы можете сделать что-то вроде этого:
class ValidationRule:
def __init__(self, **kwargs):
for (k, v) in kwargs.items():
setattr(self, k, v)
Ответ 4
class ValidationRule:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
Ответ 5
Вы можете установить свои аргументы kwargs
, обновив атрибут __dict__
экземпляра.
class ValidationRule:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
Ответ 6
Это можно считать более приятным, чем обновление __dict__
:
class C:
def __init__(self, **kwargs):
vars(self).update(kwargs)
>>> c = C(a='a', b='b')
>>> c.a # returns 'a'
>>> c.b # returns 'b'
Ответ 7
Я нашел ответы выше, а затем уточнил:
class MyObj(object):
def __init__(self, key1=1, key2=2, key3=3):
for (k, v) in locals().iteritems():
if k != 'self':
setattr(self, k, v)
Тест:
>>> myobj = MyObj(key1=0)
>>> print myobj.key1
0
И проверка также существует:
>>> myobj = MyObj(key4=4)
TypeError: __init__() got an unexpected keyword argument 'key4'