python: создать экземпляр класса в другом классе (с общим примером)
Я изучаю python через книгу и интернет, и я застрял на проблеме класса.
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)