将对象分配给网格时,属性不存在

时间:2015-07-17 09:26:02

标签: python class object nested-lists

我目前拥有的代码不起作用

import pprint

class Kile(object):
    def __init__(self, name):
        self.name = name

        kilevalue = 1

        def checkkilevalue(self):
            print (self.kilevalue)


kilecounter = 0
krid = []
for row in range(4):
    krid.append([])
    for colomn in range(4):
        krid[row].append([])
        for level in range(3):
            krid[row][colomn].append([])
            for tile in range(1):
                krid[row][colomn][0].append(Kile(kilecounter))
                kilecounter += 1            

print(kilecounter)
print(krid[0][0][0])
pprint.pprint(krid)
print(krid[0][0][0].kilevalue)

它显示网格,它显示[row][colomn][0]个地方的对象,但它没有.kilevalue属性

现在另一种方式确实有效,但我不需要它。

class Tile(object):
    def __init__(self, name):
        self.name = name

        tilevalue = 0

        def checktilevalue(self):
            print (self.tilevalue) 

trid = []
ttilecounter = 0
for row in range(3):
    trid.append([])
    for colomn in range(3):
        trid[row].append(Tile(ttilecounter))
        ttilecounter += 1


print(ttilecounter)
pprint.pprint(trid)
print(dir(trid[0][0]))

4 个答案:

答案 0 :(得分:0)

我认为您的错误是您只在函数本身中分配kilevalue。我想你希望将kilevalue分配给班级。

为此,请将kilevalue = 1更改为self.kilevalue = 1

编辑:我认为krid [row] [colomn] [0]总是无,因为你没有设置它。 尝试在krid[row][colomn][0] = []

之前添加krid[row][colomn][0].append(Kile(kilecounter))

答案 1 :(得分:0)

您的kile对象没有kilevalue实例变量。在__init__()方法中,您只是创建一个名为kilevalue而不是实例变量的局部变量。

您需要在1方法中将self.kilevalue分配给__init__() kilevalue作为实例变量 -

def __init__(self, name):
        self.name = name
        self.kilevalue = 1

答案 2 :(得分:0)

__init__的{​​{1}}方法中,您正在分配Kile,但您将其用作财产。

我认为您需要将其更改为kilevalue = 1才能以您希望的方式使用它。

注意:您还在self.kilevalue = 1内定义checkkilevalue方法。它将无法从其他任何地方访问(假设缩进在您的示例中是正确的)

答案 3 :(得分:0)

所以经过一些修补和尝试答案以及更多的修修补补后我找到了解决方案。虽然我真的不明白它。

class Kile(object):
    def __init__(self, name):
        self.name = name

    kilevalue = 2

    def checkkilevalue(self):
        print (self.kilevalue)

krid = []
kilecounter = 0
for row in range(4):
    krid.append([])
    for colomn in range(4):
        krid[row].append([])
        for level in range(1):
            krid[row][colomn].append(Kile(kilecounter))
            kilecounter += 1
        for level in range(2):
            krid[row][colomn].append([])

所以首先我将对象附加到第三个列表,然后将另外两个空列表项追加到该列表中。这很有效。无论如何,感谢您的支持:)