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

时间:2018-03-04 20:49:04

标签: python class object instantiation

我想知道它是否更好:

  1. 将Object1传递给Object2以供使用
    1. 从Object2实例化Object1
    2. 我也可以这样做,但我想知道什么是更好的做法,或者我可以赶上的地方。

      这些是相当基本的例子,当然在第二个例子中,我可以使用该列表。我正在使用的实际代码,我需要使用很多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)
      

2 个答案:

答案 0 :(得分:0)

这取决于具体情况。

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

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

答案 1 :(得分: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