Python noob не может заставить метод класса работать

1

У меня есть метод в классе 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)

Я не понимаю несоответствия в количестве аргументов. Что происходит?

Теги:
class-method

2 ответа

13
Лучший ответ

Первым аргументом для 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 я обычно использовал функции уровня модуля.

  • 0
    Под функцией уровня модуля вы подразумеваете функцию, которую можно использовать в любой модели? Это то, что я надеюсь сделать в конце концов. Во всяком случае, это исправило это для меня. Благодарю.
  • 0
    Под функцией уровня модуля я подразумеваю, что у меня есть модуль customer (или любой другой) с классом Customer и функцией customer_from_row() которая возвращает новый экземпляр Customer .
Показать ещё 1 комментарий
5

Вы хотите:

@classmethod
def save_from_row(cls, row):

Методы класса получают класс метода в качестве первого аргумента.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню