Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
8 / 7 / 6
Регистрация: 13.02.2016
Сообщений: 180

Пропавший атрибут self у экземпляра класса

06.03.2018, 14:55. Показов 1506. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Управляющая программа:
Python
1
2
3
4
5
6
7
#! usr/bin/env/python3
import shelve as crt
import alfalist as alf
all=crt.open('termbd')
work=alf.Direct(all)
work.GenTrans()
all.close()
соответствующий класс из модуля:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Direct:
    def __init__(self,workbd):
        self.bd=workbd
        self.way=0
        self.lavel=0
        self.ex=0
        self.acc=0
    def GenTrans(self,box=self.bd):
        field=0
        for i in box:
            print(i)
        while True:
            var=input('для открытия записей нажмите "o"\n для перехода назад нажмите "b"\n для заверешения перемещения введите "e".')
            if var=='o':
                field=self.streintransport(box)
            elif var=='b':
                field=self.backway()
            elif var=='e':
                print('вы успешно вышли')
                break
            else:
                print('неверная команда, введите ещё раз')
        return field
все используемые функции в классе присутствуют, но не преведены дабы не загружать тему.
вывод терминала:
Traceback (most recent call last):
File "usetest", line 3, in <module>
import alfalist as alf
File "/home/user/python/alfalist.py", line 27, in <module>
class Direct:
File "/home/user/python/alfalist.py", line 132, in Direct
def GenTrans(self,box=self.bd):
NameError: name 'self' is not defined

Почему отсутствует self, когда в конструкторе он задан? И что сделать чтобы код работал?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2018, 14:55
Ответы с готовыми решениями:

Как можно изменить атрибут экземпляра одного класса при добавлении/изменении экземпляра другого класса
Мне нужно, чтобы при создании города/деревни уже существующей области (т.е. уже создана область с таким названием) изменялись атрибуты...

Как создать атрибут экземпляра класса в методе экземпляра класса?
Здравствуйте. Подскажите, как в javascript создать новый атрибут экземпляра класса в методе экземпляра? class YandexMap{ //...

Создание экземпляра класса - наследника экземпляра другого класса
Имеется два класса: класс Layer и класс-наследник Neuron. Я создал экземпляр класса Layer l1 и задал его свойства, теперь мне необходимо...

8
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
06.03.2018, 15:05
Так можно

Python
1
2
3
def GenTrans(self,box=None):
        if box is None:
            box=self.bd
1
 Аватар для Semen-Semenich
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,310
06.03.2018, 18:03
наверно лучше так, на то он и класс.
Python
1
2
3
4
def GenTrans(self):
        field=0
        for i in self.bd:
           print(i)
2
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
09.03.2018, 10:53
переменная `self.bd` появится только после инициализации класса, а инициализация метода `def GenTrans(self,box=self.bd)` (да и любых объектов) происходит при загрузке модуля, а при загрузке модуля ты вот никак не можешь обратиться к self, потому что его еще не существует.
2
8 / 7 / 6
Регистрация: 13.02.2016
Сообщений: 180
09.03.2018, 13:47  [ТС]
почему инициализация метода происходит при загрузке модуля, если это метод класса? по идее же инициализация метода должна происходить при инициализации класса?
запиливаю предыдущий код с комментами:
Python
1
2
3
4
5
6
7
#! usr/bin/env/python3
import shelve as crt
import alfalist as alf #загрузка модуля содержащего рабочие классы один из которых Direct
all=crt.open('termbd')
work=alf.Direct(all)#создание экземпляра класса Direct
work.GenTrans()#вызов метода GenTrans через экземпляр.
all.close()
то есть чтобы код работал в данной форме, нужно явно импортировать класс из модуля?
ну и стандартный вопрос - если я не так понимаю где можно про это почитать на русском(если книжка большая, например Марк Лутц Изучаем Питон то с указанием главы, если можно).

Добавлено через 7 минут
разьве класс не инициализируется при создании экземпляра?

Добавлено через 5 минут
Semen-Semenich, box не обязательно равна self.bd
0
 Аватар для Semen-Semenich
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,310
09.03.2018, 13:51
Цитата Сообщение от zerkalo Посмотреть сообщение
Semen-Semenich, box не обязательно равна self.bd
как?
Python
1
def GenTrans(self,box=self.bd):
0
8 / 7 / 6
Регистрация: 13.02.2016
Сообщений: 180
09.03.2018, 14:11  [ТС]
это значение по умолчанию.
то есть пр вызове:
Python
1
obj.GenTrans()
box=self.bd, а при если:
Python
1
obj.GenTrans(workdict)
box=workdict функция принимает словарь и перемещается по вложенным словарям в обоих направлениях
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
09.03.2018, 14:50
Лучший ответ Сообщение было отмечено zerkalo как решение

Решение

Код на питоне выполняется последовательно, строчка за строчкой. Класс (объект типа/экземпляр type) создаётся при выполнении модуля, когда интерпритатор исполняет иинструкцию class. Тело класса выполняется практически так же как и код верхнего уровня, за исключением того, что все имена и новосозданные объекты (точнее ссылки на них) запихиваются в __dict__ класса (личное пространство имен), а не модуля (глобальное пространство имен). На этом этапе методы - обычные функции, они даже не знают, что принадлежат какому-то классу. Параметр self - ссылка на инстанс класса, которая, разумеется, не существует пока этот самый инстанс не будет создан. На самом деле имя self - соглашение. В строке def GenTrans(self, box=self.bd): self как первый параметр и self в self.bd - разные вещи; первый - просто имя в локальной области создаваемой функции, второй - исполняемый код, - питон будет искать имя self в глобальном пространстве имен (в данном случае), и, если его нет, бросит исключение.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Dummy: pass
    
self = Dummy()
self.bd = 'dummy'
 
class Direct:
    def method(self, bd=self.bd):
        print(bd)
 
 
d = Direct()
 
d.method()
d.method('inst')
1
8 / 7 / 6
Регистрация: 13.02.2016
Сообщений: 180
09.03.2018, 15:01  [ТС]
shsv, благодарю, теперь ясно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.03.2018, 15:01
Помогаю со студенческими работами здесь

Почему при вызове метода у экземпляра класса он сначала ищет у экземпляра
Всем привет, после прочтения Лутца про ООП появился такой вопрос почему при вызове метода у экземпляра класса он сначала ищет у экземпляра,...

Создание экземпляра класса, разрушение экземпляра класса
Не могу найти информацию про разрущение экземпляра класса. Объясните пожалуйста, что это?

При создании экземпляра класса, создается 2 экземпляра вместо 1
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех конструкторах (1. по умолчанию, 2. со всеми...

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...

Сложение экземпляра базового класса и экземпляра наследника
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения &quot;знал&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru