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

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

06.03.2018, 14:55. Показов 1475. Ответов 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
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
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
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
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
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru