22

我正在通过书籍和互联网学习 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

5 回答 5

11

实例或类的所有属性都可以通过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 不是关键字,它只是一个参数名称,例如aand b,因此如果您来自 Java 背景,您可能会想使用它this来代替……但不要这样做!为此目的有一个非常强大的约定,self如果你使用其他任何东西,你会让很多人(最终包括你自己)非常生气!

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

编辑

作为对@dwstein 评论的回应,我不确定它是如何在 VB 中完成的,但这是创建类实例时传递参数的方式。

如果我们看看你的课:

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

我们可以通过将第二行更改为来将其更改为接受参数 baz ,def __init__(self, baz):然后如果我们愿意,我们可以通过设置来baz为我们的新实例创建一个属性。希望有帮助。BARself.baz = baz

于 2012-08-17T16:16:49.023 回答
2

在 python 中,访问类实例的成员时,您总是必须使用“self”前缀。尝试

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

    def something_else(self, a, b):
        self.foo1.do_something(a, b)
于 2012-08-17T15:55:03.153 回答
1

您走在正确的轨道上,请尝试:

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

    def something_else(self, a, b):
        self.foo1.do_something(a, b)
于 2012-08-17T15:55:38.863 回答
0

如果您不def __init__(self):为类创建方法,则必须将类初始化为:例如:

class XYZ:
    def foo(self):
        ....
        ....
r1 = XYZ()

并访问您必须编写的方法r1.foo() 但是当您创建了一个 init 方法时,您必须访问 foo 函数,因为它 在您的代码self.foo()中等于so,而不是,它应该是r1.foo()foo1.do_something()self.foo1.do_something()

于 2019-11-08T06:15:00.047 回答
0

我不确定我是否理解你的问题,这更多地反映了我而不是你。如果我了解您要查找的内容,则您想在类方法中创建类的实例。现在,我可能在这里“偏离基础”,所以如果这令人困惑,那可能是我在回答与您的问题不同的问题。

#! /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_listinstance_list将是一个实例列表。类方法make_instances就是这样做的:它创建实例并填充instance_list. 在程序结束时,我创建an_instance了“通常”创建实例的方式。an_instanceclass 的对象也是如此MyClass

我希望这是有帮助的

于 2017-08-19T06:25:08.497 回答