将类的实例(类的对象)传递给python中的另一个类

时间:2014-06-14 19:53:31

标签: python oop parameter-passing

我不明白的是 b = Bar(a) 。它有什么作用? Bar如何作为一个论点?不是说Bar继承自?什么是Bar.Foo1 = Foo?这是否意味着Foo1是类Foo()的实例?当它本身是一个对象时,我们如何访问Foo1? b.arg.variable是什么意思?难道它不意味着b有一个方法arg,它有一个变量叫做变量吗?以下代码来自answer

如果问题是天真的,请原谅我。我只是找不到解析对象作为另一个类的参数。任何澄清都会很棒!

  class Foo (object):
  #^class name  #^ inherits from object

      bar = "Bar" #Class attribute.

      def __init__(self):
          #        #^ The first variable is the class instance in methods.  
          #        #  This is called "self" by convention, but could be any name you want.


          self.variable="Foo" #instance attribute.
          print self.variable, self.bar  #<---self.bar references class attribute
          self.bar = " Bar is now Baz"   #<---self.bar is now an instance attribute
          print self.variable, self.bar  

       def method(self,arg1,arg2):
          #This method has arguments. You would call it like this : instance.method(1,2)
          print "in method (args):",arg1,arg2
          print "in method (attributes):", self.variable, self.bar


 a=Foo() # this calls __init__ (indirectly), output:
             # Foo bar
             # Foo  Bar is now Baz
 print a.variable # Foo
 a.variable="bar"
 a.method(1,2) # output:
               # in method (args): 1 2
               # in method (attributes): bar Bar is now Baz
 Foo.method(a,1,2) #<--- Same as a.method(1,2).  This makes it a little more explicit what the argument "self" actually is.

 class Bar(object):
     def __init__(self,arg):
          self.arg=arg
          self.Foo1=Foo()

 b=Bar(a)
 b.arg.variable="something"
 print a.variable # something
 print b.Foo1.variable # Foo

2 个答案:

答案 0 :(得分:8)

&#34;我不明白的是b = Bar(a)。它做了什么?&#34;

b = Bar(a)做了两件事。首先,它创建了一个类Bar的对象(附加了任何类变量和方法)。然后,它运行__init__,第一个参数(self)指向刚刚创建的对象,a作为第二个参数(arg)。在运行__init__时,作为该方法中的一个命令,它将self.arg设置为指向arg指向的对象(即,变量{{1}指向的对象}})。最后,变量a设置为引用已创建的对象。

以这种方式思考可能有所帮助:Python中的变量实际上只是指向对象的指针。您可以有多个指向同一对象的变量。在这种情况下,ba都指向同一个对象。

起初,我发现这种事情也让人感到困惑。我已经看到了将变量视为与它们所指向的对象不同的概念的建议,并将其视为不必要地使事情复杂化,但我不得不回过头来接受这种思维方式以便理解事物。人们经常使用变量作为名称来引用它指向的对象;你只需知道何时从字面上理解这一点。

&#34;这并不意味着Bar继承了?&#34;

没有。如果b.arg是一个类,那么a将意味着Bar继承自class Bar(a)。但在 ab = Bar(a)是作为参数传递给a的对象。

&#34;什么是Bar.Foo1 = Foo?&#34;

抱歉 - 我在您提供的示例代码中看不到。

&#34; b.arg.variable是什么意思?&#34;

__init__是一个对象(我的意思是,b指的是一个对象),b是该对象的属性之一。方法和变量是不同类型的属性。在这种情况下,b.arg是指向对象的变量。 b.arg引用的对象具有属性b.arg,这是一个变量。

variable指的是b.arg引用的同一个对象,因此ab.arg.variable是同一个变量。它不仅指向同一个对象,而且实际上是同一个变量。它指向的对象是字符串a.variable

@Brenbarn:我认为这就是quirius所说的&#34;并不意味着Bar继承了?&#34;。

答案 1 :(得分:3)

这是一个更简单的例子。假设你有这些类:

class Foo(object):
    pass

class Bar(object):
    def __init__(self, arg):
        self.arg = arg

您可以做以下两件事:

# Option 1: pass in an integer
>>> b = Bar(1)
>>> b.arg
1

# Option 2: pass in a Foo object
>>> a = Foo()
>>> b = Bar(a)
>>> b.arg
<__main__.Foo object at 0x0000000002A440F0>

如何处理这两种情况没有区别。传递a(一个Foo对象)与传入一个整数没什么不同。 Bar所做的就是存储传入的值,无论是Foo还是int,它都可以存储它。当你调用Bar(something)时,完全由Bar类决定如何处理传入的对象。除了Bar之外,不涉及传入对象的类型。选择明确地涉及它(例如,通过调用传入的对象上的方法)。