python: создать экземпляр класса в другом классе (с общим примером)

Я изучаю python через книгу и интернет, и я застрял в проблеме класса.

2 вопроса:

  1. Как создать экземпляр одного класса в другом (отдельном) классе?
  2. Как передать переменные между классом и вложенным (?) Классом?

Когда я пытаюсь создать экземпляр класса в другом (отдельном) классе, я могу сделать это в рамках метода. Вот код:

import os class FOO(): def __init__(self): self.values = [2, 4, 6, 8] def do_something(self, x, y): os.system("clear") z = self.values[x] * self.values[y] print "%r * %r = %r" % (self.values[x], self.values[y], z) class BAR(): def __init__(self): pass def something_else(self, a, b): foo1 = FOO() foo1.do_something(a, b) bar = BAR() bar.something_else(1, 2) 

Позволит ли я мне получить доступ к классу FOO и его информации в других методах BAR? Если да, то как?

Я попробовал следующее и получил сообщение об ошибке:

 import os class FOO(): def __init__(self): self.values = [2, 4, 6, 8] def do_something(self, x, y): os.system("clear") z = self.values[x] * self.values[y] print "%r * %r = %r" % (self.values[x], self.values[y], z) class BAR(): def __init__(self): foo1 = FOO() def something_else(self, a, b): foo1.do_something(a, b) bar = BAR() bar.something_else(1, 2) 

Вот ошибка:

 Traceback (most recent call last): File "cwic.py", line 22, in <module> bar.something_else(1, 2) File "cwic.py", line 19, in something_else foo1.do_something(a, b) NameError: global name 'foo1' is not defined 

Я получаю ту же ошибку, когда использовал:

 def __init__(self): self.foo1 = FOO() 

Кроме того, как мне передать «значения» из одного класса в другой?

Пожалуйста, дайте мне знать, если мой общий подход и / или синтаксис неверны. Любые предложения приветствуются (включая хорошее чтение), поскольку я просто изучаю. Благодарю.

4 Solutions collect form web for “python: создать экземпляр класса в другом классе (с общим примером)”

Все атрибуты экземпляра или класса доступны через self который передается как первый аргумент для всех методов. Вот почему вы правильно получили подпись метода something_else(self, a, b) а не просто something_else(a, b) как вы могли бы с другими языками. Итак, вы ищете:

  class BAR(): def __init__(self): self.foo1 = FOO() def something_else(self, a, b): self.foo1.do_something(a, b) 

Обратите внимание, что self не является ключевым словом, это просто имя paramater, такое как a и b , поэтому вы, например, можете попробовать использовать this вместо этого, если вы работаете на фоне Java … Не правда! существует очень сильное соглашение о том, чтобы использовать self для этой цели, и вы сделаете много людей (в том числе и самого себя) очень злым, если будете использовать что-нибудь еще!

Что касается передачи значений, я не уверен, что вы имеете в виду, вы можете получить к ним доступ через такие экземпляры, как foo1.an_attribute или передать их в качестве аргументов для функций, как в function(arg) но, похоже, вы использовали оба метода в своем примере Я не уверен, что еще вам нужно …

редактировать

В ответ на комментарий @ dwstein я не уверен, как это делается в VB, но вот как вы передаете аргументы при создании экземпляра класса.

Если мы посмотрим на ваш класс:

 class BAR(): def __init__(self): self.foo1 = FOO() 

Мы можем изменить это, чтобы принять аргумент baz, изменив вторую строку, чтобы def __init__(self, baz): а затем, если мы хотим, мы можем сделать baz атрибутом нашего нового экземпляра BAR , установив self.baz = baz . Надеюсь, это поможет.

В python вы всегда должны использовать префикс «self» при обращении к членам вашего экземпляра класса. Пытаться

 class BAR(): def __init__(self): self.foo1 = FOO() def something_else(self, a, b): self.foo1.do_something(a, b) 

Вы на правильном пути, попробуйте:

 class BAR(): def __init__(self): self.foo1 = FOO() def something_else(self, a, b): self.foo1.do_something(a, b) 

Я не уверен, понимаю ли я ваш вопрос, который скорее отражает меня, чем вас. Если я понимаю, что вы ищете, вы хотите создать экземпляр класса в методе класса. Теперь я мог бы быть «вне базы», ​​поэтому, если это сбивает с толку, возможно, я отвечаю на другой вопрос из вашего вопроса.

 #! /usr/bin/env python3 class MyClass ( object ): instance_list = [] def __init__ ( self, arg1, arg2): self.arg1 = arg1 self.arg2 = arg2 @classmethod def make_instances( cls ): for a1 in range(1,4): for a2 in range(1,3): cls.instance_list.append( MyClass( a1, a2 ) ) @classmethod def dump_instance_list ( cls ): for instance in cls.instance_list: print( "arg1= %d\targ2= %d" % ( instance.arg1, instance.arg2) ) if __name__ == "__main__" : MyClass.make_instances() MyClass.dump_instance_list() an_instance = MyClass(14, 22) print("An instance: %d, %d" % (an_instance.arg1, an_instance.arg2)) 

Эта программа создает класс MyClass , который имеет объект класса, instance_list . instance_list будет списком экземпляров. класс метод make_instances делает именно это: он создает экземпляры и заполняет instance_list . В конце программы я создаю an_instance так, как можно «нормально» создать экземпляр. Итак, an_instance является объектом класса MyClass .

Я надеюсь, что это полезно

  • Получение имени экземпляра внутри класса __init __ ()
  • Python проверяет экземпляры классов
  • Как python обрабатывает экземпляр объекта в цикле 'for'
  • Адресация строки имени экземпляра в __init __ (self) в Python
  • Получение имени класса экземпляра в Python
  • Как избежать нескольких экземпляров программы?
  • В чем разница между переменными класса разных типов?
  • Синтаксис инициализатора объекта (c #) в python?
  •  
    Interesting Posts for Van-Lav

    Общий вопрос о двоичных файлах

    В Python попробуйте до тех пор, пока не произойдет ошибка

    Музыкальная библиотека Python?

    Создание взвешенной карты США на основе данных состояния

    Делайте попарное сравнение каждого элемента в двух наборах и возвращайте верхний рейтинг 3-го списка

    Ошибка при запуске транзакции с несколькими группами объектов через носетиты

    Как настройки, дистрибутивы и пипсы связаны друг с другом?

    Инвертировать изображение, отображаемое imshow в matplotlib

    sklearn selectKbest: какие переменные были выбраны?

    Python 3 – urllib, ошибка HTTP 407: требуется проверка подлинности прокси

    Создать 64-битное значение из объекта datetime

    Получение объекта 'str' не имеет атрибута 'get' в Django

    Окончание Vim Python

    Элементы исчезают из поля со списком, когда я читаю их из модели

    сделать поле модели django только для чтения или отключить администратор при первом сохранении объекта

    Python - лучший язык программирования в мире.