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
Python将类对象传递给另一个类_Python_Oop - Fatal编程技术网

Python将类对象传递给另一个类

Python将类对象传递给另一个类,python,oop,Python,Oop,如果我有两个文件class1_file.py和class2_file.py,并且每个文件都有类class1和class2 class1_file.py class class1: def dummy(self, class2): class2.dummy() class2_file.py: class class2 def dummy(self): print 'hey' 我是否需要将:从class2_文件导入class2到class1_文件.

如果我有两个文件
class1_file.py
class2_file.py
,并且每个文件都有类
class1
class2

class1_file.py

class class1:
    def dummy(self, class2):
        class2.dummy()
class2_file.py:

class class2
    def dummy(self):
        print 'hey'

我是否需要将:
从class2_文件导入class2
class1_文件.py
中,以便class1
dummy
中的方法工作?我有点困惑,因为我来自强类型语言,它需要导入类并将它们传递到方法中以供使用。但是对于python来说,这个参数似乎可以是任何类型的,它将在编译时解析它。如果它不是必需的,那么
class1
中的方法如何知道
class1
dummy
函数中会出现什么?

不必,因为在签名
中定义dummy(self,class2):
class2只是方法
dummy
中的局部变量。它也可以是
def dummy(self,foo):
只要
foo
是方法为
dummy
的对象。请参阅。

不要将变量命名为class2。是的,您需要从class2_文件导入class2

from class2_file import class2

class class1:
    def dummy(self, class2_obj):
        class2_obj.dummy()

如果您打算将
class2
的对象传递给
class1
dummy
,那么要创建
class2
的对象,您需要导入class2

from class2_file import class2
class class1:
    def dummy(self, obj):      # To avoid confusion changed the variable name
        obj.dummy()

class1().dummy(class2())       # import is needed for `class2()` part only
除此之外,
class2
只是一个变量名,可以是任何名称。这就是为什么我在这个答案中将它改为
obj

当您执行
class2()
Python将在所有有效范围内查找
class2
的定义,但不会找到它。但当你这么做的时候

from class2_file import class2
您在本模块中将
class2
作为本地名称引入。因此,Python将能够识别它

    def dummy(self, class2):
        class2.dummy()

当您创建这样一个函数时,Python将尝试执行
class2.dummy()
,它将
class2
作为参数,而不是类,因为
class2
是范围中最接近的名称。只要为
class2
传递的值具有
dummy
方法,该行将被正确计算。

这仅在foo具有“dummy”方法的情况下有效,对吗?谢谢。但这是否意味着@zhangxaochen的答案是错误的?@user1234440他的答案也是正确的。检查我答案的最后一行。他只是想说明那一点。