python传递对象或从第二个对象中实例化

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

我想知道它是否更好:

  1. 将Object1传递给Object2以供使用

要么

  1. 从Object2实例化Object1

我也可以做,但我想知道什么是更好的做法,或者我可以赶上的地方。

这些是相当基本的例子,当然在第二个例子中,我可以使用该列表。我正在使用的实际代码,我需要使用很多Object1值来处理Object2中的事情。

例1:

class Object1:
    def __init__(self, person):
       self.id = person[0]
       self.name = person[1]
       self.age = person[2]


class Object2:
    def __init__(self, object1):
      self.object1 = object1

      retirement_age = self.object1.age + 25

      print(self.object1.id)
      print(self.object1.name)
      print(retirement_age)

 person = [1, 'Ryan', 30]
 o = Object1(person)
 r = Object2(o)

例2:

class Object1:
    def __init__(self, person):
       self.id = person[0]
       self.name = person[1]
       self.age = person[2]


class Object2:
    def __init__(self, person):
       self.o = Object1(person)

       retirement_age = self.o.age + 25

       print(self.o.id)
       print(self.o.name)
       print(retirement_age)

person = [1, 'Ryan', 30]
r = Object2(person)
python class object instantiation
2个回答
0
投票

嗯,这取决于,只有你可以决定。

在第一个示例中,您可以在整个程序中的许多位置使用o,而无需一遍又一遍地创建相同的对象(只需确保您不在任何地方修改它,请参阅下面的原因)。

第二个选项封装了Object1甚至存在的事实。

你需要问自己一些问题:

  • 你会在代码库中的其他地方使用Object1实例吗?在Object1实例之外有一个“独立的”Object2实例是否有意义?
  • Object2需要了解Object1吗?它需要知道如何构建它吗?它应该关心吗?
  • Object2实例可以直接包含Object1的属性吗?如果答案是'是'那么Object1是多余的。

您必须非常小心选项1.如果您传递给Object2的对象在任何地方被修改,则更改将影响所有相应的Object2实例。

class Object1:
    def __init__(self, person):
       self.id = person[0]
       self.name = person[1]
       self.age = person[2]


class Object2:
    def __init__(self, object1):
      self.object1 = object1

      retirement_age = self.object1.age + 25

      print(self.object1.id)
      print(self.object1.name)
      print(retirement_age)

person = [1, 'Ryan', 30]
o = Object1(person)
r = Object2(o)

# modifying o.name will affect r.object1.name as well
o.name = 'John'
print(r.object1.name)
#  1
#  Ryan
#  55
#  John

0
投票

这取决于具体情况。

您可以使用第一种方法,因为Object2不需要任何有关如何构建Object1的信息。

另一方面,如果你需要在person中使用Object2,你应该使用第二种方法,因为它更容易使用person而不是self.object1.id,特别是如果你不得不多次使用person

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