2012-08-17 281 views
9

我正在通过书和互联网学习python,并且我被困在类问题上。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

实例或类的所有属性都通过把作为第一个参数的所有方法通过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。希望有所帮助。

+0

感谢您的彻底解答!很有帮助。我想了解如何将信息从一个类传递到另一个类。我想我已经将参数看作是类定义的一部分,我想知道这是否正确。但是,我不知道如何使用该功能。顺便说一下,我有一个VBA背景。 – dwstein 2012-08-17 16:23:06

2

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

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

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

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

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

    def something_else(self, a, b): 
     self.foo1.do_something(a, b) 
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_instance是类MyClass的一个对象。

我希望这有帮助

相关问题