Python “通过一门课”;“自我”;对于其他类别';实例?
根据现有代码,我需要从另一个类中的一个类创建实例,而调用方类中包含初始化被调用类所需的大量信息 将调用者类的某些属性传递给被调用类的方法可能类似于下面的示例,将Python “通过一门课”;“自我”;对于其他类别';实例?,python,Python,根据现有代码,我需要从另一个类中的一个类创建实例,而调用方类中包含初始化被调用类所需的大量信息 将调用者类的某些属性传递给被调用类的方法可能类似于下面的示例,将self作为参数传递,它执行的是预期的操作,但我想知道它是否正确,或者是否有更好的方法 class A: def __init__(self): self.x = 1 self.y = 10 self.myObj = B(self) class B: def __init_
self
作为参数传递,它执行的是预期的操作,但我想知道它是否正确,或者是否有更好的方法
class A:
def __init__(self):
self.x = 1
self.y = 10
self.myObj = B(self)
class B:
def __init__(self, Obj_from_A):
self.i = None
self.j = None
self.v= Obj_from_A.x
self.w = Obj_from_A.y
A_obj = A()
print(A_obj.myObj.v, A_obj.myObj.w)
输出:
1 10
2 1 10
110
你的类做你认为它正在做的事情,除非它可能不做
(顺便说一句,您的代码没有运行:您没有定义B_Obj
)
请参阅我在末尾添加的额外代码:
class A:
def __init__(self):
self.x = 1
self.y = 10
self.myObj = B(self)
class B:
def __init__(self, Obj_from_A):
self.i = 0
self.j = 0
self.v= Obj_from_A.x
self.w = Obj_from_A.y
A_obj = A()
print(A_obj.myObj.v, A_obj.myObj.w)
A_obj.x = 2 # Now update the x member
print(A_obj.x, A_obj.myObj.v, A_obj.myObj.w)
输出:
1 10
2 1 10
这里的
A_obj.x
已更改,但B
的实例保留了以前的值。您的类执行您认为它正在执行的操作,除非它可能不执行
(顺便说一句,您的代码没有运行:您没有定义B_Obj
)
请参阅我在末尾添加的额外代码:
class A:
def __init__(self):
self.x = 1
self.y = 10
self.myObj = B(self)
class B:
def __init__(self, Obj_from_A):
self.i = 0
self.j = 0
self.v= Obj_from_A.x
self.w = Obj_from_A.y
A_obj = A()
print(A_obj.myObj.v, A_obj.myObj.w)
A_obj.x = 2 # Now update the x member
print(A_obj.x, A_obj.myObj.v, A_obj.myObj.w)
输出:
1 10
2 1 10
此处
A_obj.x
已更改,但B
的实例保留了以前的值。我看不出有什么特别的错误。您是否确定需要分别存储v
和w
,而不是仅保留a本身对Obj\u的引用?(这确实创建了一个引用循环,但垃圾收集可以处理这个循环。)传递self
是一种非常合理且惯用的方法,可以为其他对象提供对此对象的引用。当然,您可以重写它,以便B.\uu init\uuu(self,v,w)
,然后self.myObj=B(self.x,self.y)
,但任何一个都可以;这只是一个问题,B
采用“具有x
和y
属性的东西”(或“特别是一个a”)或采用“一对坐标”感觉“更自然”,这是无法从这个玩具模型中判断的,但在大多数真实代码中应该是显而易见的。谢谢@chepner的回复。我认为是的,因为我试图尽可能完整地保留原始(真实)代码,但我认为你的观点更合理。这也值得考虑,因为self.myObj=B(self)
是有意创建参考循环的方法(正如@chepner所说,这很好——我很确定stdlib中有确切的例子),一个a
代码的读者(他没有看到B
)可能认为您在这里是有意的。如果这可能会产生误导,那么这可能是传递self.x,self.y
的另一个原因。另一方面,如果这没有误导,甚至可能是您在v2.0中最终可能会做的事情,那么这可能是传递self
的一个原因。问问自己是否正在链接A
到B
的一个实例,或者用A
的一个实例初始化B
的一个实例。无论是哪一个实例,都要添加一条注释。我看不出这有什么特别的错误。您确定需要分别存储v
和w
,而不是只保存一个引用toObj_from_A
本身?(这确实创建了一个引用循环,但垃圾收集可以处理这个循环。)传递self
是一种非常合理和惯用的方法,可以给其他对象一个对这个对象的引用。当然,您可以重写它,以便B.\uu init_u(self,v,w)
然后self.myObj=B(self.x,self.y)
,但两者中的任何一个都可以;问题在于B
获取“具有x
和y
属性的东西”(或“特别是a”)或获取“一对坐标”是否感觉“更自然”-这是不可能从这个玩具模型来判断的,但在大多数真实代码中应该是显而易见的。谢谢@chepner的回复。我想是的,因为我正试图保持原始(真实)代码尽可能完整,但我认为你的观点更合理。这也值得考虑,因为self.myObj=B(self)
是一种有意创建引用循环的方法(正如@chepner所说,这很好——我很确定stdlib中有确切的例子),是a
代码的读者(他没有看到B
的代码)可能认为您在这里是有意的。如果这可能会产生误导,那么这可能是传递self.x,self.y
的另一个原因。另一方面,如果这没有误导,甚至可能是您在v2.0中最终可能会做的事情,那么这可能是传递self
的一个原因。问问自己是否正在链接A
到B
的实例,或用A
的实例初始化B
的实例。无论是哪一个实例,都要添加注释。