Python noob не может заставить метод класса работать - PullRequest
1 голос
/ 01 февраля 2011

В моем классе 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

Когда я пытаюсь запустить свой скрипт, я получаю это:

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)

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

Ответы [ 2 ]

13 голосов
/ 01 февраля 2011

Первый аргумент classmethod - это сам класс. Попробуйте

@classmethod
def save_from_row(cls, row):
    c = cls()
    # ...
    return c

или

@staticmethod
def save_from_row(row):
    c = Customer()
    # ...
    return c

Вариант classmethod позволит создавать подклассы Customer с той же заводской функцией.

Вместо варианта staticmethod я бы обычно использовал функции уровня модуля.

5 голосов
/ 01 февраля 2011

Вы хотите:

@classmethod
def save_from_row(cls, row):

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

...