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, и это информация в других методах бара? Если да, то как?

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

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 ответов


все атрибуты экземпляра или класса осуществляется через 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" при доступе к членам вашего экземпляра класса. Попробуй!--2-->

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)