为什么我收到此错误“NameError:name'self'未定义。”

时间:2017-08-14 00:01:42

标签: python

作为练习python的一种方式我正在尝试编写一个创建数独游戏的小程序。我发现了与我的问题类似的多个问题,但似乎没有一个问题完全相关。

#!usr/bin/python3
from random import randint


class Puzzle :
    def __init__(self, **puzzle): 
        puzzle = [[0 for x in range(9)]for y in range(9)]

    def createEasy(self):
        count = 0
        while(count < 32):
            i = randint(0,8)
            j = randint(8,9)
            k = randint(1,9)
            if (self.puzzle[i][j] != 0):
                self.puzzle[i][j] = k
                count += 1

    def createMedium(self):
        count = 0
        while(count < 30):
            i = randint(0,8)
            j = randint(8,9)
            k = randint(1,9)
            if (self.puzzle[i][j] != 0):
                self.puzzle[i][j] = k
                count += 1
    def createHard(self):
        count = 0
        while(count < 26):
            i = randint(0,8)
            j = randint(8,9)
            k = randint(1,9)
            if (self.puzzle[i][j] != 0):
                self.puzzle[i][j] = k
                count += 1


    def main():
        print("Welcome to sudoku!!!")
        answer = input( "what level of difficultly do you want today?")
        if (answer == "easy"):
            self.createEasy()
            for x in Puzzle.puzzle:
                for y in x:
                    print(y)
                print('\n')

Puzzle.main()

我发现大多数答案要么与未按正确顺序定义的函数有关,要么不将“self”放在所有函数的参数列表中。一个答案甚至说在init函数中摆脱了“self”参数,但这也没有帮助。我也找到了这个答案,虽然我认为它也不相关。 NameError: name 'self' is not defined我唯一能想到的是我需要在其他地方声明名为puzzle的列表,因为它假设是一个类变量,但是从python代码我不认为这不是我的真实不确定,因为它是2d并且写拼图= [] []是错误的。

对不起,这是整个输出错误。

Welcome to sudoku!!!
what level of difficultly do you want today?easy
Traceback (most recent call last):
  File "sudoku_maker.py", line 49, in <module>
    Puzzle.main()
  File "sudoku_maker.py", line 43, in main
    self.createEasy(self)
NameError: name 'self' is not defined

3 个答案:

答案 0 :(得分:1)

如果进行以下更改,错误消失:

  1. 添加self作为main()功能的参数。
  2. 创建班级的实例:p = Puzzle()然后调用p.main()
  3. self.puzzle函数中写__init__而不只是puzzle
  4. (然后有不同的错误,但与此无关)

答案 1 :(得分:1)

首先,在声明拼图属性的__init__方法中,您忘记了self,因此未声明:

def __init__(self, **puzzle): 
    self.puzzle = [[0 for x in range(9)] for y in range(9)]

在宣布主要功能时,您也忘记了de self。而且,在这个内部你也有错误,当你致电Puzzle.puzzle时,它应该是self实例:

def main(self):
    print("Welcome to sudoku!!!")
    answer = input( "what level of difficultly do you want today? ")
    if (answer == "easy"):
        self.createEasy()
        for x in self.puzzle:
            for y in x:
                print(y)
            print('\n')

最后,当你调用这个函数时。您需要首先创建Puzzle实例,但是您使用的是Puzzle.main,因此您没有初始化对象,因此self实例将不存在。

你必须这样做:

Puzzle().main()

但是,使用randint(a, b)时会出现另一个错误,因为此函数会在ab之间生成一个随机int,但包含限制,因此当您在{{1}中调用它时,9,不应该在限制范围内。

答案 2 :(得分:1)

您似乎希望main()成为类方法或静态方法而不是实例方法。类方法是不绑定到对象而是绑定到类的方法。在这种情况下,您需要清楚地定义它。

https://docs.python.org/3.5/library/functions.html#classmethod https://docs.python.org/3.5/library/functions.html#staticmethod

这个答案清楚地解释了类方法和静态方法之间的区别。 What is the difference between @staticmethod and @classmethod in Python?

解决问题的另一种方法是:

  1. 通过传递main()作为参数,将self作为实例方法。

    main(self)
    
  2. 创建一个Puzzle对象。

    puzzle = Puzzle()
    
  3. 调用对象的主要方法。

    puzzle.main()