У меня есть метод в классе Customer
под названием save_from_row()
. Это выглядит так:
@classmethod
def save_from_row(row):
c = Customer()
c.name = row.value('customer', 'name')
c.customer_number = row.value('customer', 'number')
c.social_security_number = row.value('customer', 'social_security_number')
c.phone = row.value('customer', 'phone')
c.save()
return c
Когда я пытаюсь запустить мой script, я получаю следующее:
Traceback (most recent call last):
File "./import.py", line 16, in <module>
Customer.save_from_row(row)
TypeError: save_from_row() takes exactly 1 argument (2 given)
Я не понимаю несоответствия в количестве аргументов. Что происходит?
Первым аргументом для classmethod
является сам класс. Попробуйте
@classmethod
def save_from_row(cls, row):
c = cls()
# ...
return c
или
@staticmethod
def save_from_row(row):
c = Customer()
# ...
return c
Вариант classmethod
позволит создавать подклассы Customer
с той же функцией factory.
Вместо варианта staticmethod
я обычно использовал функции уровня модуля.
Вы хотите:
@classmethod
def save_from_row(cls, row):
Методы класса получают класс метода в качестве первого аргумента.
customer
(или любой другой) с классомCustomer
и функциейcustomer_from_row()
которая возвращает новый экземплярCustomer
.