python:在另一个类中创建类的实例(使用通用示例)

dws*_*ein 12 python class instance

我正在通过书籍和互联网学习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)
Run Code Online (Sandbox Code Playgroud)

但是,这是否允许我访问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)
Run Code Online (Sandbox Code Playgroud)

这是错误:

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
Run Code Online (Sandbox Code Playgroud)

我使用时遇到同样的错误:

def __init__(self):
    self.foo1 = FOO()
Run Code Online (Sandbox Code Playgroud)

另外,我应该如何将"值"从一个类传递到另一个类?

如果我的一般方法和/或语法错误,请告诉我.我正在学习的任何和所有建议都欢迎(包括良好的阅读).谢谢.

red*_*rah 6

访问实例或类的所有属性,通过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)
Run Code Online (Sandbox Code Playgroud)

需要注意的是自我是不是关键字,它只是一个paramater名称,如ab,所以你可能例如可以尝试使用this,而不是如果你是从Java背景......不过不要!有一个非常强大的惯例self用于此目的,如果你使用其他任何东西,你会让很多人(包括你自己)非常生气!

关于传递值,我不确定你的意思,你可以通过实例访问它们,foo1.an_attribute或者将它们作为参数传递给函数,function(arg)但你似乎在你的例子中使用了这两种技术,所以我不知道还有什么你是......

编辑

在回应@dwstein的评论时,我不确定它是如何在VB中完成的,但这里是一个如何在创建类的实例时传递参数.

如果我们看你的班级:

class BAR():
    def __init__(self):
        self.foo1 = FOO()
Run Code Online (Sandbox Code Playgroud)

我们可以通过改变第二行来改变它接受参数baz def __init__(self, baz):然后如果我们想要通过设置我们可以创建baz新实例的属性.希望有所帮助.BARself.baz = baz