python 从第二个对象中传递对象或实例化
python pass object or instantiate from within second object
我想知道是否更好:
- 将Object1传给Object2使用
或
- 从 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
我想知道是否更好:
- 将Object1传给Object2使用
或
- 从 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