2017-02-12 9 views
0

Я пытаюсь использовать переменную, определенную в классе A в классе B. В принципе мне нужна запись пользователя в классе A, чтобы быть именем файла в качестве данных, которые я сохраняю в классе B Вот мой код:использовать переменную в классе A для класса B в python

class A(object): 

    def __init__(self, master): 
     self.master = master 
     self.labelSub=Label(self.master, text="Participant No.") #where users their name 
     self.entrySub=Entry(self.master,bg="grey") 
     A.csv_name_sub = str(self.entrySub.get()) #save users entry 

class B(A): 

    def __init__(self, master): 
     self.master = master 
     A.csv_name_sub = str(self.entrySub.get()) 
     self.resultFile = open("/Users/Desktop/" + A.csv_name_sub + 
          '_results.csv', 'w') #use the users entry as the name of the csv file I save 

Но ошибка говорит мне «AttributeError: объект„B“не имеет атрибута„entrySub“». Не могли бы вы мне помочь? Благодаря!!

+0

Сделать глобальную переменную, добавив 'Global' в начало класса с переменной. Как 'Global A' –

ответ

0

Конструктор унаследованного класса А не вызывается автоматически: https://docs.python.org/3.5/reference/datamodel.html?highlight=baseclass#object.init

После callling конструктор базового класса, ваш экземпляр B должен иметь атрибут:

class B(A): 

    def __init__(self, master): 
     A.__init__(self, master) 
     ... 

См https://docs.python.org/3.5/tutorial/classes.html#class-and-instance-variables объяснить разницу между переменные класса и переменные экземпляра.

Редактировать: Эрик отредактирован быстрее. ;)

+0

Привет, Майкл, спасибо за ваш ответ. Я пробовал ваш код, и никаких ошибок не было (программа запускалась), но имя файла не сохраняется, как в 'csv_name_sub + _results.csv'. Вот мой код 'class B (A): def __init __ (self, master):' 'A .__ init __ (self, master)', 'A.csv_name_sub = str (self.entrySub.get())', 'self. resultFile = open ("/ Users/Desktop /" + A.csv_name_sub + '_results.csv', 'w') '. Он не сказал, что csv_name_sub не существует, но просто не отображается в имени файла. Ты знаешь почему? Thx снова! – key

2

Внутри B.__init__, A.__init__ не был вызван, поэтому self.entrySub не определен.

Этот thread (Understanding Python super with init methods) может вам помочь.

Вы можете заменить первые 2 строки B.__init__ позвоните по номеру super.

Примечание: вы уверены, что хотите смешать переменные класса и экземпляра, подобные этому? Для всех объектов A существует только один A.csv_name_sub, но, похоже, он зависит от master, который может быть различным для каждого объекта A.

+0

Привет, Эрик, спасибо! Есть другие объекты в классе A и классе B. Я не показывал их всех, так как я хочу, чтобы мой код был кратким. Все они на одном хозяине. – key

+0

Я использовал 'class ChildA' Base .__ init __ (self)' в предложенной вами странице (также Майкл предложил ниже). Но это не сработало. Атрибут AttributeError не появился, и программа запустилась, но имя файла не изменилось в соответствии с этой записью. Вот мой код 'class B (A): def __init __ (self, master):' 'A .__ init __ (self, master)', 'A.csv_name_sub = str (self.entrySub.get())', 'self. resultFile = open ("/ Users/Desktop /" + A.csv_name_sub + '_results.csv', 'w') '. Имя файла, которое я получил, это только «_results.csv». Ты знаешь почему? – key

 Смежные вопросы

  • Нет связанных вопросов^_^