Как сделать пользовательские классы в web2py

Я пытаюсь создать класс в модуле, импортировать файл этого модуля в свой контроллер, а затем ссылаюсь на класс, определенный в этом модуле, но продолжаю получать сообщение, которое гласит: NameError("name 'self' is not defined")

Вот мой код в моем созданном модуле:

from gluon import *

class device_info(object):

    self.info = {}

    def __init__(self, info):
        self.info = info
        return
    def setInfo(info):
        self.info = info
        return
    def getInfo():
        return self.info`

Кто-нибудь знает, что вызывает это и как это можно решить? У меня сложилось впечатление, что пользовательские классы поддерживаются в web2py.


person B Welch    schedule 19.07.2016    source источник
comment
поместите self.info = {} в __init__. Не думайте о self как о каком-то волшебном ключевом слове, это просто еще один аргумент, он не определен вне метода, который получает его в качестве входных данных (например, __init__)   -  person pretzlstyle    schedule 19.07.2016
comment
вау... спасибо @jphollowed   -  person B Welch    schedule 19.07.2016
comment
Я относительно новичок в Python и начал с Java. Наверное, я предполагал, что self — это Python-версия this @jphollowed   -  person B Welch    schedule 19.07.2016
comment
Он похож на this, но в python его следует использовать более явно, и все функции в классе должны принимать self в качестве первого аргумента. уточню в ответе   -  person pretzlstyle    schedule 19.07.2016


Ответы (1)


Как уже говорилось, просто переместите self.info = {} в __init__().

__init__() по сути является конструктором, с которым вы знакомы из java. Он инициализирует экземпляр объекта этого класса при вызове. Я не использовал Java какое-то время, но я не думаю, что вам следует объявлять переменные класса вне вашего конструктора.

self — это аргумент, который все методы внутри класса в Python должны получить в качестве своего первого аргумента. Так что ваши геттеры и сеттеры тоже не сработают, если вы их попробуете; они должны быть:

def setInfo(self, info) и def getInfo(self)

Когда вы создаете объект, например:

device1 = device_info()

он вызывает __init()__, передавая device1 как self. Затем всякий раз, когда вы используете этот объект, например

device1.setInfo(newInfo), вы можете думать о методе в контексте класса, вызываемом как setInfo(device1, newInfo), поскольку device1 это self, или текущий используемый экземпляр объекта device_info.

Вам также не нужен аргумент object в определении класса. Что вы ожидаете от этого?


Редактировать: на самом деле не перемещайте self.info = {} в __init__(), просто избавьтесь от него. У вас уже есть self.info = info в __init__(). Вам не нужно инициализировать такие переменные в Python, как в Java. Создание пустого dict, а затем установка его на другой dict без какого-либо использования является излишним.

person pretzlstyle    schedule 19.07.2016
comment
В Python __new__() является конструктором, а не __init__(). - person Waqas; 19.07.2016
comment
@Waqas Правильно, но я сказал по существу конструктор. Не нужно его смущать, если он пришел с Java и пытается провести параллели, __init__() будет делать именно так, как вы ожидаете, и вы обычно не будете писать свой собственный __new__(). - person pretzlstyle; 19.07.2016