我试图通过以下方式从列表中获取最后一个位置:
X = ['A','B','C']
Y = ['1','2','3']
class Combination:
def __init__(self,x,y):
if (x in X) and (y in Y):
self.x = x
self.y = y
else:
print "WRONG!!"
def __str__ (self):
return x+y
class Position:
def __init__(self):
self.xy = []
for i in X:
for j in Y:
self.xy.append(Combination(i,j))
def choose_last(self):
return self.xy.pop()
def __str__(self):
return "List contains: " + str(self.xy)
P1 = Position()
print P1
P2 = Position.choose_last()
print P2
我的结果是:
List contains: [A1, A2, A3, B1, B2, B3, C1, C2, C3]
Line 30: TypeError: choose_last() takes exactly 1 arguments (0 given)
由于我是OOP的新手,我不知道我在这里做错了什么。有什么建议吗?
答案 0 :(得分:0)
您可以使用[-1]
访问列表的最后一项:
>>> lst = range(10)
>>> lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lst[-1]
9
pop
会从列表中删除该项目。
无论如何,你使用的是错误的类。
在这种特定情况下 - 你应该这样做:
pos = Position()
print pos
last_item = pos.choose_last()
print last_item
而不是:
P1 = Position()
print P1
P2 = Position.choose_last()
print P2
答案 1 :(得分:0)
List contains: [A1, A2, A3, B1, B2, B3, C1, C2, C3]
Line 30: TypeError: choose_last() takes exactly 1 arguments (0 given)
这是因为你为一个类而不是对象调用choose_last()。在Python中,所有调用类(对象)实例的方法都有一个隐含的第一个参数:self
换句话说,调用P1.choose_last()
就像:
Position.choose_last(P1)
Interpreter希望您传递一个参数self
,或者调用对象的方法,而不是类。当然,调用对象的方法是首选的OOP方法,因为你可以编写代码而不知道对象的确切类 - 你操作的对象可以是polymorphic。
来自Python文档:
实际上,你可能已经猜到了答案:特别的事情 方法是将对象作为第一个参数传递 功能。在我们的示例中,调用x.f()完全等效于 MyClass.f(X)。通常,使用n个参数列表调用方法 相当于用参数调用相应的函数 通过在第一个方法之前插入方法的对象而创建的列表 参数。
至于从列表中检索最后一个元素,按照惯例,负指数意味着'我从头算起':
def choose_last(self):
return self.xy[-1]