Атрибут __setattr__
только присваивает один атрибут в то время, если вы хотите назначить несколько атрибутов, вы можете использовать **kwargs
в вашем заголовке функции и для ограничения количества аргументов, вы можете просто проверить длину kwargs
в пределах вашей функции. и позвоните по номеру __setattr__
для каждого из аргументов один за другим. Одной из веских причин этого рецепта является то, что в принципе назначение атрибута объекту без учета чего-либо не является правильной и желательной работой из-за множества причин. Таким образом, вы должны назначать каждый атрибут по одному, рассматривая все необходимые условия.
Вы также можете сделать это вручную, обновив словарь экземпляра, но также должны обрабатывать исключения.
In [80]: class foo:
def bar(self, **kwargs):
if len(kwargs) != 4:
raise Exception("Please enter 4 keyword argument")
for k, v in kwargs.items():
foo.__setattr__(self, k, v)
....:
In [81]: f = foo()
In [82]: f.bar(w=1, x=2, y=3, z=4)
In [83]: f.w
Out[83]: 1
In [84]: f.bar(w=1, x=2, y=3, z=4, r=5)
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-84-758f669d08e0> in <module>()
----> 1 f.bar(w=1, x=2, y=3, z=4, r=5)
<ipython-input-80-9e46a6a78787> in bar(self, **kwargs)
2 def bar(self, **kwargs):
3 if len(kwargs) != 4:
----> 4 raise Exception("Please enter 4 keyword argument")
5 for k, v in kwargs.items():
6 foo.__setattr__(self, k, v)
Exception: Please enter 4 keyword argument
С помощью __setatter__
он будет автоматически заботиться, за исключением:
In [70]: f.bar(1, 2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-70-07d1f3c9e27f> in <module>()
----> 1 f.bar(1, 2)
<ipython-input-65-1049e26120c1> in bar(self, *args)
2 def bar(self, *args):
3 for item in args:
----> 4 foo.__setattr__(self, item, item)
5
TypeError: attribute name must be string, not 'int'
информацию, которую вы ищете будет определен в [Python Language Reference - Модель данных - объекты, значения и типы] (https://docs.python.org/2/reference/datamodel.html#objects-values-and-types) ссылка ([ссылка на версию 3] (https://docs.python.org/3/reference/datamodel .html # объекты-значения и-типа)). Не похоже, что список параметров определен как часть объекта функции. –
Просто нашел это после того, как я разместил вопрос. [Получение списка имен параметров внутри функции Python] (http://stackoverflow.com/questions/582056/getting-list-of-parameter-names-inside-python-function) Это может ответить на мой вопрос. Не стесняйтесь отмечать этот вопрос как дубликат. –
@JEarls Список параметров не определен, но в верхней части функции или метода 'locals()' будет содержать только параметры (включая 'self', если это метод). –