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

问题描述 投票:0回答:2

我不明白的是

b = Bar(a)
。它有什么作用?
Bar
如何将
a
作为参数?

这不是意味着

Bar
继承自
a
吗?什么是
Bar.Foo1 = Foo
?这是否意味着
Foo1
是类
Foo()
的实例?当
Foo1
本身是一个对象时,我们如何访问它?
b.arg.variable
是什么意思?这不是意味着
b
有一个方法
arg
,它有一个名为
variable
的变量吗?以下代码来自这个答案

我只是找不到解析对象作为另一个类的参数。

  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
python oop
2个回答
14
投票

“我不明白的是 b = Bar(a)。它有什么作用?”

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

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

a
b.arg
都指向同一个对象。

一开始我也发现这种事情很令人困惑。我曾看到过将变量视为与它们所指向的对象不同的概念的建议,并忽略了它,因为它使事情不必要地复杂化,但我必须重新接受这种思维方式才能理解事物。人们确实经常使用变量作为名称来引用它所指向的对象;你只需要知道何时按字面意思理解这句话。

“这是否意味着 Bar 继承自 a?”

不。如果

a
是一个类,那么
class Bar(a)
就意味着 Bar 继承自
a
。但在
b = Bar(a)
a
是作为参数传递给
__init__
的对象。

“什么是 Bar.Foo1 = Foo?”

抱歉——我在您提供的示例代码中没有看到这一点。

“b.arg.variable 的含义是什么?”

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

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

@Brenbarn:我认为这就是 quirius 所说的“这不意味着 Bar 继承自 a 吗?”的意思。


12
投票

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

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>
>>> b
<__main__.Bar at 0x7fb2ebca9cd0>

这两种情况的处理方式没有区别。传入

a
(Foo 对象)与传入整数没有什么不同。
Bar
所做的只是存储传入的值,并且无论它是 Foo 还是 int,它都可以以相同的方式存储它。当您调用
Bar(something)
时,完全取决于
Bar
类如何处理传入的对象。传入对象的类型不涉及,除非
Bar
选择显式涉及它(例如,通过调用传入对象上的方法)。

© www.soinside.com 2019 - 2024. All rights reserved.