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

python pass object or instantiate from within second object

我想知道是否更好:

  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)

这取决于上下文。

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

另一方面,如果您需要在 Object2 中使用 person,您应该使用第二种方法,因为使用 person 比 [=15] 更容易=],尤其是当您不得不多次使用 person 时。

好吧,这要看情况,只有你能决定。

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

第二个选项概括了 Object1 甚至存在的事实。

你需要问自己几个问题:

  • 您会在代码库的其他任何地方使用 Object1 实例吗?在 Object2 实例之外有一个 "standalone" Object1 实例是否有意义?

  • Object2 需要了解 Object1 吗?它需要知道如何构造它吗?它应该关心吗?

  • Object2实例可以直接包含Object1的属性吗?如果答案是 'yes' 那么 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