python中类的构造函数中的AttributeError

时间:2019-01-03 03:12:15

标签: python

我是Python的新手,并且是第一次使用Python开发类。当我尝试使用构造函数时,虽然我不确定为什么会发生AttributeError,但是却得到了AttributeError。

class Pawn(object):

    def __init__(self, x: int, y: int):
        if (not x in range(1,9)):
            raise ValueError('Invalid X-Position')
        if (not y in range(1,9)):
            raise ValueError('Invalid Y-Position')
        self.x = x
        self.y = y

    @staticmethod
    def parseFromString(sPawn):
        try:
            return Pawn(ord(sPawn[0]) - 96, int(sPawn[1]))
        except ValueError:
            raise ValueError('Parse Failed. Please check pawn string.')

    def getLethals(self):
        lethals = {}

        try:
            lethals.append(Pawn(self.x - 1, self.y))
            lethals.append(Pawn(self.x + 1, self.y))
            lethals.append(Pawn(self.x, self.y - 1))
            lethals.append(Pawn(self.x, self.y + 1))
            lethals.append(Pawn(self.x - 1, self.y - 1))
            lethals.append(Pawn(self.x + 1, self.y + 1))
            lethals.append(Pawn(self.x - 1, self.y + 1))
            lethals.append(Pawn(self.x + 1, self.y - 1))
        except ValueError:
            pass

        return lethals

    def packToString(self):
        return str(chr(self.x + 96)) + str(self.y)

    @property
    def x(self):
        return self.x

    @property
    def y(self):
        return self.y

当我尝试创建实例时:

def testFunc():
    pawn = Pawn(2,4)

我得到一个:

AttributeError: can't set attribute

一直追溯到“典当”构造函数的“ self.x = x”。

编辑:我不了解属性是否撤销了类变量的写权限。我将添加二传手。

1 个答案:

答案 0 :(得分:-1)

尝试一下:

  • xy使用其他内部名称,即_x_y。在班级内部,我们使用_x_y,而在班级外部,我们使用xy
  • setterx添加了y

代码:

class Pawn(object):
    def __init__(self, x: int, y: int):
        if (not x in range(1,9)):
            raise ValueError('Invalid X-Position')
        if (not y in range(1,9)):
            raise ValueError('Invalid Y-Position')
        self._x = x
        self._y = y

    @staticmethod
    def parseFromString(sPawn):
        try:
            return Pawn(ord(sPawn[0]) - 96, int(sPawn[1]))
        except ValueError:
            raise ValueError('Parse Failed. Please check pawn string.')

    def getLethals(self):
        lethals = {}

        try:
            lethals.append(Pawn(self._x - 1, self._y))
            lethals.append(Pawn(self._x + 1, self._y))
            lethals.append(Pawn(self._x, self._y - 1))
            lethals.append(Pawn(self._x, self._y + 1))
            lethals.append(Pawn(self._x - 1, self._y - 1))
            lethals.append(Pawn(self._x + 1, self._y + 1))
            lethals.append(Pawn(self._x - 1, self._y + 1))
            lethals.append(Pawn(self._x + 1, self._y - 1))
        except ValueError:
            pass

        return lethals

    def packToString(self):
        return str(chr(self._x + 96)) + str(self._y)

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, val):
        self._x = val

    @property
    def y(self):
        return self._y

    @y.setter
    def y(self, val):
        self._y = val

pawn = Pawn(2,4)
print(pawn.x)
print(pawn.y)