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

python:在另一个类中创建类的实例(带有通用示例),python,class,instance,Python,Class,Instance,我正在通过书本和互联网学习python,我被一个课堂问题困住了 2个问题: 如何在另一个(单独的)类中创建一个类的实例 如何在类和嵌套(?)类之间传递变量 当我试图在另一个(单独的)类中创建一个类的实例时,我能够在一个方法中这样做。代码如下: import os class FOO(): def __init__(self): self.values = [2, 4, 6, 8] def do_something(self, x, y): os

我正在通过书本和互联网学习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类及其在其他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
    
    另外,我应该如何将“值”从一个类传递到另一个类


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

    在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)
    

    实例或类的所有属性都通过
    self
    访问,self作为第一个参数传递给所有方法。这就是为什么您正确地获得了方法签名
    something\u other(self,a,b)
    ,而不是像其他语言那样只获得
    something\u other(a,b)
    。所以你在寻找:

        class BAR():
            def __init__(self):
                self.foo1 = FOO()
    
        def something_else(self, a, b):
            self.foo1.do_something(a, b)
    
    请注意,self不是一个关键字,它只是一个参数名,如
    a
    b
    ,因此,如果您来自Java背景,您可能会尝试使用
    this
    。。。别这样!为此,使用
    self
    有一个非常强大的惯例,如果你使用其他任何东西,你会让很多人(包括你自己)非常生气

    关于传递值,我不确定您的意思,您可以通过实例(例如
    foo1.an_属性
    )来访问它们,或者将它们作为参数传递给函数(如
    function(arg)
    ),但您在示例中似乎使用了这两种技术,因此我不确定您还想要什么

    编辑

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

    如果我们看看你的班级:

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

    我们可以通过将第二行更改为
    def\uuuu init\uuuuuuuuuuuuuuuuuuself(self,baz):
    来接受参数baz,如果需要,我们可以通过设置
    self.baz=baz
    使
    baz
    成为
    BAR
    的新实例的属性。希望这能有所帮助。

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

    #! /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
    ,它有一个class对象,
    instance\u list
    <代码>实例列表将是实例列表。类方法
    make_instances
    就是这样做的:它创建实例并填充
    instance_list
    。在程序结束时,我以“正常”创建实例的方式创建一个实例。因此,
    a_实例
    是类
    MyClass
    的对象


    我希望这是有帮助的

    如果您没有为类创建
    def\uuuu init\uuuu(self):
    方法,则必须将类初始化为: 例如:

    要访问该方法,必须编写
    r1.foo()
    但是,在创建init方法时,您必须以
    self.foo()
    的形式访问foo函数,该函数等于
    r1.foo()

    因此,在您的代码中,应该是
    self.foo1.dou something()
    ,而不是
    foo1.dou something()

    ,谢谢您的详细回答!非常有用。我试图了解pas信息是如何从一个类传递到另一个类的。我想我已经将参数视为类定义的一部分,我想知道这是否是正确的方法。但是,我不知道如何使用这个功能。顺便说一下,我有VBA背景。
    #! /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))
    
    class XYZ:
        def foo(self):
            ....
            ....
    r1 = XYZ()