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

时间:2012-08-17 15:48:38

标签: python class instance

我正在通过书籍和互联网学习python,而我却陷入了课堂问题。

2个问题:

  1. 如何在另一个(单独)类中创建一个类的实例?
  2. 如何在类和嵌套(?)类之间传递变量?
  3. 当我尝试在另一个(单独的)类中创建一个类的实例时,我能够在一个方法中这样做。这是代码:

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

    另外,我应该如何将“值”从一个类传递给另一个类?

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

5 个答案:

答案 0 :(得分:5)

通过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) ,就像你使用其他语言一样。所以你在寻找:

a

请注意,self不是关键字,它只是一个参数名称,例如bthis,因此您可能会尝试使用self代替,如果您来自Java背景......不要!为了这个目的使用foo1.an_attribute有一个非常强烈的惯例,如果你使用其他任何东西,你会让很多人(包括你自己)非常生气!

关于传递值,我不确定你的意思,你可以通过function(arg)之类的实例访问它们,或者将它们作为参数传递给class BAR(): def __init__(self): self.foo1 = FOO() 中的函数,但你似乎已经使用过你的例子中的两种技巧,所以我不确定你还有什么...

修改

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

如果我们看你的班级:

def __init__(self, baz):

我们可以通过将第二行更改为baz来更改它以接受参数baz,然后如果我们希望我们可以通过设置{BAR来设置self.baz = baz新实例的属性{{1}} {1}}。希望有所帮助。

答案 1 :(得分:2)

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

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

    def something_else(self, a, b):
        self.foo1.do_something(a, b)

答案 2 :(得分:1)

你走在正确的轨道上,试试:

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

    def something_else(self, a, b):
        self.foo1.do_something(a, b)

答案 3 :(得分: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。在程序结束时,我按照通常&#34;通常&#34;的方式创建an_instance创建一个实例。因此an_instance是类MyClass的对象。

我希望这很有用

答案 4 :(得分:0)

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

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

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