Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中将类的实例(类的对象)传递给另一个类_Python_Oop_Parameter Passing - Fatal编程技术网

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

在python中将类的实例(类的对象)传递给另一个类,python,oop,parameter-passing,Python,Oop,Parameter Passing,我不明白的是b=Bar(a)。它有什么作用?酒吧是如何将a作为论据的?这难道不意味着酒吧继承自一个家庭吗?什么是Bar.Foo1=Foo?这是否意味着Foo1是类Foo()的实例?当Foo1本身是一个对象时,我们如何访问它?b.arg.variable的含义是什么?这难道不意味着b有一个方法arg,它有一个名为variable的变量吗?以下代码来自 如果这个问题很幼稚,请原谅我。我只是找不到解析对象作为另一个类的参数。任何澄清都很好 class Foo (object): #^class

我不明白的是b=Bar(a)。它有什么作用?酒吧是如何将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
类Foo(对象):
#^类名#^继承自对象
bar=“bar”#类属性。
定义初始化(自):
##^第一个变量是方法中的类实例。
##按照惯例,这称为“自我”,但可以是您想要的任何名称。
self.variable=“Foo”#实例属性。

打印self.variable,self.bar#这里是一个简单的示例。假设您有以下类:

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>
#选项1:传入整数
>>>b=巴(1)
>>>b.arg
1.
#选项2:传入一个Foo对象
>>>a=Foo()
>>>b=巴(a)
>>>b.arg
这两起案件的处理方式没有区别。传入
a
(Foo对象)与传入整数没有什么不同。
Bar
所做的只是存储传入的值,它可以存储相同的值,无论它是Foo还是int。当调用
Bar(something)
时,如何处理传入的对象完全取决于
Bar
类。传入对象的类型不涉及,除非
Bar
选择显式涉及它(例如,通过调用传入对象上的方法)。

“我不理解的是b=Bar(a)。它做什么?”

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

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

起初,我觉得这类事情也令人困惑。我曾经看到过这样的建议:将变量视为独立于它们所指向的对象的概念,并将其视为不必要的复杂事物而忽略,但为了理解事物,我不得不重新接受这种思维方式。人们经常使用变量作为名称来引用它所指向的对象;你只需要知道什么时候该从字面上理解这个

“这难道不意味着酒吧继承自一个家庭吗?”

不可以。如果
a
是一个类,那么
class Bar(a)
将意味着该条继承自
a
。但是在
b=Bar(a)
a
是作为参数传递给
的对象

“什么是Bar.Foo1=Foo?”

抱歉--我在您给出的示例代码中没有看到这一点

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

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

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


@布伦巴恩:我想这就是奎里乌斯所说的“酒吧继承自a”的意思

你应该通过阅读来熟悉Python的基础知识。我读过。不存在将对象传递给另一个类的情况。而我无法从其他来源获得这一信息。在Python中,一切都是一个对象。将一个对象传递给一个类与传递一个整数(如该示例中所示)、一个字符串或其他任何东西没有区别。那么b是一个Bar类的对象,它的构造函数将被调用来初始化b、a`s(Foo())或Bar()?b.arg.变量是什么?我不明白你在问什么
a
已经用行
a=Foo()
创建,此时调用了Foo的
\uuuu init\uuu
。当执行
Bar(a)
时,将调用Bar的
\uuuu init\uuuu
。您发布的示例中的评论似乎已经基本上回答了您提出的问题。@qurius:这真的是您提出的问题吗?从你的问题来看,我完全不清楚。谢谢。很抱歉,我提出了一些琐碎的问题,但我无法脱离java框架,将变量视为变量而不是对象。@qurius:如果我理解正确,现在你似乎真的在问
Bar(a)
是否创建了一个新的对象,该对象以某种方式“基于”
a
(例如,
a
)的副本。说起来可能很好!:-)当你问“Bar(a)做什么”时,你不清楚你不明白的是什么。是的,这确实是我想问的它也是