蟒蛇:在另一个类中创建类的实例(与一般的例子)(python: create instance of

2019-07-31 01:49发布

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

另外,我应该如何通过从一个类中的“价值”到其他?

请让我知道,如果我的一般方法和/或语法都错了。 任何和所有的建议表示欢迎(包括良好的阅读),因为我只是学习。 谢谢。

Answer 1:

一个实例或类的所有属性通过访问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)

需要注意的是自我是不是关键字,它只是一个paramater名字像ab ,所以你可能例如可以尝试使用this代替,如果你从Java背景是......不过不要! 有一个很强烈的使用约定self用于此目的,你会让很多人(包括自己最终)很生气,如果你使用别的!

至于传球值我不知道你的意思,你可以通过诸如情况下访问他们foo1.an_attribute或它们作为参数传递给函数在function(arg)但你似乎在你的例子都用了这样的技术我不知道你后还有什么?

编辑

为了响应@ dwstein的评论,我不知道它是如何在VB中完成,但这里有一个创建类的实例时,你如何传递参数。

如果我们看一下类:

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

我们可以改变,通过改变第二行接受参数巴兹def __init__(self, baz):然后如果我们希望我们可以让baz我们新的实例属性的BAR通过设置self.baz = baz 。 希望帮助。



Answer 2:

在Python中,你总是有访问您的类实例的成员时,使用了“自我”的前缀。 尝试

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

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


Answer 3:

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

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

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


Answer 4:

我不知道如果我理解你的问题,这是个我比你反映的。 如果我知道你在找什么,你想一个类的方法中创建一个类的实例。 现在,我可以“的方式关闭基地在这里,因此,如果这是混乱的,它可能是我回答您的问题不同的问题。

#! /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_instance是类的对象MyClass

我希望这是有帮助的



文章来源: python: create instance of class in another class (with generic example)