gpt4 book ai didi

python - 传递不同的输入参数时创建默认类对象

转载 作者:太空宇宙 更新时间:2023-11-04 10:54:10 25 4
gpt4 key购买 nike

我有两个类 PairSequencePair 对象有两个属性,position 和 value。 Sequence 对象是 Pair 对象的序列。

class Pair():
def __init__(self, position, value):
self.position = position
self.value = value
self.pair = (position, value)

def __repr__(self):
return "< Position: {0}, Value: {1} >".format(self.position, self.value)

class Sequence(Pair):
def __init__(self, pairs):
self.pairs = pairs
self.cseg = [pair.value for pair in pairs]
self.positions = [pair.position for pair in pairs]

def __repr__(self):
return "< Seq. {0} >".format(" ".join([str(x) for x in self.cseg]))

我可以用这个创建一个 Sequence 对象:

>>> Sequence([Pair(0, 2), Pair(2, 8), Pair(3, 1))
< Seq. 2 8 1 >
>>> Sequence.pairs
[< Position: 0, Value: 2 >,
< Position: 2, Value: 8 >,
< Position: 3, Value: 1 >]

如何创建一个Sequence 对象,只给出Pair 值列表,如下面的代码?在这种情况下,Pair 位置必须是从 0 到 n - 1 的序列,其中 n 是 Sequence 的长度。

>>> Sequence([2, 8, 1])
< Seq. 2 8 1 >
>>> Sequence.pairs
[< Position: 0, Value: 2 >,
< Position: 1, Value: 8 >,
< Position: 2, Value: 1 >]

我尝试使用此版本的 Sequence,但没有成功。我收到此错误:

AttributeError: 'int' object has no attribute 'value'

class Sequence(Pair):
def __init__(self, pairs):

if not isinstance(pairs[0], Pair):
self = Sequence([Pair(pos, val) for pos, val in enumerate(pairs)])

self.pairs = pairs
self.cseg = [pair.value for pair in pairs]
self.positions = [pair.position for pair in pairs]

def __repr__(self):
return "< Seq. {0} >".format(" ".join([str(x) for x in self.cseg]))

最佳答案

当您传入一个包含非Pair 对象的列表时,以下将创建一个Pair 对象列表,否则它会简单地分配给定的列表code>Pair 对象到 self.pairs:

class Sequence(Pair):
def __init__(self, pairs):
if not isinstance(pairs[0], Pair):
self.pairs = [Pair(pos, val) for pos, val in enumerate(pairs)]
else:
self.pairs = pairs
self.cseg = [pair.value for pair in self.pairs]
self.positions = [pair.position for pair in self.pairs]

你得到错误的原因是尽管你检查了 pairs 的内容,你仍然将它分配给 self.pairs:

class Sequence(Pair):
def __init__(self, pairs):
# the following code will run when you're passing a list of integers
if not isinstance(pairs[0], Pair):
self = Sequence([Pair(pos, val) for pos, val in enumerate(pairs)])
# but the next line will also run
# which means self.pairs` is now a list of integers
self.pairs = pairs
# and that means pair in the following line is an int, not a Pair:
self.cseg = [pair.value for pair in pairs]
self.positions = [pair.position for pair in pairs]

最后,您不应该在构造函数中执行以下操作(分配给 self):

self = Sequence([Pair(pos, val) for pos, val in enumerate(pairs)])

您正在尝试“覆盖”或“替换”self 对象,但这意味着您正在构造另一个 Sequence 对象在 Sequence 的构造函数中。在这种情况下这是不必要的,因为您可以在同一个构造函数中处理这两种情况。反过来,这会导致更简洁的代码。

关于python - 传递不同的输入参数时创建默认类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11299715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com