Атрибут Python __init__ self недоступен, несмотря на то, что его можно распечатать

Работал нормально весь день, вдруг перестал. Я вообще не верю, что изменил код, может у меня мозг перестал работать ???

class BorderWidgetWithLabel(BorderWidget): 

    def __init__(self, **kwargs):
        super(BorderWidgetWithLabel, self).__init__(**kwargs)

        self.text = " "
        self.text=kwargs.get('text',' ')
        print self.text
        self.txt_bg_color=kwargs.get("txt_bg_color", [0,0,0,0])
        self.bg_color=kwargs.get("bg_color", [0,0,0,0])

        self.bind(pos=self.update_canvas)
        self.bind(size=self.update_canvas)
        self.update_canvas()


    def update_canvas(self, *args):
        #need to reset everything
        self.canvas.clear()

        with self.canvas:

            get_color(self.border_color)
            if (self.text! = ""):
                texture=simple_text_texture(self.text)

Проблема:

/typeclasses/borderwidget.py", line 75, in update_canvas
if (self.text! = ""):
AttributeError: 'BorderWidgetWithLabel' object has no attribute 'text'

Я начал получать эту ошибку. Я добавил self.text = " " в __init__, а также оператор if в update_canvas. Что я делаю неправильно??

Если я избавлюсь от всех видов использования self.text, тогда печать self.text будет работать без проблем.

ОБНОВЛЕНИЕ :: Исправлено добавлением text = '' в качестве переменной класса. Это необходимо ?? или что-то не так с кодом. Поскольку print self.text в в этом отлично работает без переменной класса, я не могу предоставить менее полный образец

ОБНОВЛЕНИЕ :: Я удалил последнюю строку self.update_canvas () из в этом, и она работала без переменной класса, но я попытался воспроизвести это с помощью следующего

class SomeClass:
def __init__(self, **kwargs):
    self.text=kwargs.get("text","hello")
    self.update_class()


def update_class(self, *args):
    if (self.text!=' '):
        print self.text



SomeClass()

Не знаю, почему мне тогда не удалось его воспроизвести

Можете ли вы сократить это до минимальный воспроизводимый пример, который могут запускать другие люди, не имея вашего класса BorderWidget, который все еще воспроизводит проблему? Я не вижу здесь ничего плохого, и я даже сгенерировал фиктивный BorderWidget и запустил ваш код против него, и я не получил ошибки.

abarnert 27.03.2018 06:59

Я исправил это, добавив к классу text = "" как переменную класса. Это нужно ??

Roger 27.03.2018 07:00

поскольку функция печати работает без проблем, она является внутренней, и один из пакетов, скорее всего, может минимизировать или «завершить» вопрос, кажется маловероятным, я могу попробовать

Roger 27.03.2018 07:02

Добавление text в качестве переменной класса не должно помочь. Это может Спрятать, какая бы у вас ни была проблема, но не решать. Если переменная экземпляра каким-то образом будет удалена, вы получите переменную класса - которая всегда будет ' ' вместо аргумента text из инициализатора, что бесполезно.

abarnert 27.03.2018 07:10

В любом случае, если вы не можете предоставить более полный образец, никто не сможет вам помочь. Если нет явной опечатки или чего-то, что я пропустил, что кто-то может заметить, просто нет способа отладить код, который мы не можем ни прочитать, ни запустить.

abarnert 27.03.2018 07:11

Я пытаюсь выйти из IDE и попробовать короткий сценарий консоли, который, надеюсь, воспроизведет проблему

Roger 27.03.2018 07:16

Вы также должны добавить остальную часть трассировки, это еще не все.

Paul Becotte 27.03.2018 07:18

это не удалось, я не могу воспроизвести его без пакетов Kivy

Roger 27.03.2018 07:18

BorderWidget вызывает update_canvas () в собственном методе __init __ ()? Бьюсь об заклад, это проблема ...

Paul Becotte 27.03.2018 07:20

Это была проблема, но я воспроизвел тот же сценарий, и он не потерпел неудачу даже в случае, если. Но это сработало, я вынул update_canvas

Roger 27.03.2018 07:27

Когда python не может найти переменную экземпляра, он ищет переменную класса с таким же именем. Вот почему он перестает вылетать, когда вы добавляете text='' в класс. Но это всего лишь маскировка ошибки - переменная экземпляра должна быть там. @PaulBecotte догадывается, почему это происходит. Поместите self.text = kwargs.get(...)перед в __init__, чтобы посмотреть, исправляет ли это. Это также покажет полная трассировка стека.

tdelaney 27.03.2018 07:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
11
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, похоже, у вас есть

class BW:
  def __init__(self):
    self.update_canvas()

  def update_canvas(self):
    pass

class BWL(BW):
  def __init__(self):
    super(BWL, self).__init__()
    self.text = 'text'
    self.update_canvas()

  def update_canvas(self):
    print self.text

Запуск BWL() вызовет указанное вами исключение. Это потому, что порядок событий

  1. позвоните в BWL.init
  2. который вызывает BW.init (с self = BWL)
  3. который вызывает self.update_canvas (то есть BWL.update_canvas)
  4. который обращается к self.text
  5. Затем, когда BW.init возвращается, он создает self.text
  6. и, наконец, снова вызывает self.update_canvas.

Это, вероятно, не то, что вы хотите даже без ошибки ... возможно, удалите вызов super или вызов update_canvas в дочернем элементе и настройте свойства, которые вам нужны, в методе update_canvas ПЕРЕД вызовом суперкласса.

Причиной проблемы был класс родительского класса? Спасибо за ваше время. Я понятия не имел, почему все работает, а затем внезапно остановился. БЛАГОДАРЮ ВАС!

Roger 27.03.2018 08:15

Другие вопросы по теме