Экземпляр не имеет атрибута _pi

Я пытаюсь сделать модуль Python следующим образом:

class square:
    def _init_(self):
        self._length = 0
        self._perimeter = 0
        self._area = 0
    def setLength(self, length):
        self._length = float(length)
        self._perimeter = 0
        self._area = 0
    def getLength(self):
        return self._length
    def getPerimeter(self):
        if self._perimeter == 0:
            self._perimeter = float(self._length * 4)
        return self._perimeter
    def getArea(self):
        if self._area == 0:
            self._area = float(self._length * self._length)
        return self._area
class rectangle:
    def _init_(self):
        self._length = 0
        self._width = 0
        self._perimeter = 0
        self._area = 0
    def setLength(self, length):
        self._length = float(length)
        self._perimeter = 0
        self._area = 0
    def getLength(self):
        return self._length
    def setWidth(self, width):
        self._width = float(width)
        self._perimeter = 0
        self._area = 0
    def getWidth(self):
        return self._width
    def getPerimeter(self):
        if self._perimeter == 0:
            perim1 = float(self._length * 2)
            perim2 = float(self._width * 2)
            self._perimeter = float(perim1 + perim2)
        return self._perimeter
    def getArea(self):
        if self._area == 0:
            self._area = float(self._length * self._width)
        return self._area
class circle:
    def _init_(self):
        self._radius = 0
        self._diameter = 0
        self._circumference = 0
        self._pi = 3.14159265
    def setRadius(self, radius):
        self._radius = float(radius)
        self._diameter = float(self._radius * 2)
        self._circumference = 0
    def setDiameter(self, diameter):
        self._diameter = float(diameter)
        self._radius = float(self._diameter / 2)
        self._circumference = 0
    def getRadius(self):
        return self._radius
    def getDiameter(self):
        return self._diameter
    def getPi(self):
        return self._pi
    def getCircumference(self):
        if self._circumference == 0:
            self._circumference = float(self._diameter * self._pi)
        return self._circumference
class triangle:
    def _init_(self):
        self._side = []
        self._side[0] = 0
        self._side[1] = 0
        self._side[2] = 0
        self._side[3] = 0
        self._angle = []
        self._angle[0] = 0
        self._angle[1] = 0
        self._angle[2] = 0
        self._angle[3] = 0
        self._perimeter = 0
        self._area = 0
    def setSide(self, side, length):
        self._side[side] = float(length)
    def getSide(self, side):
        return self._side[side]
    def getPerimeter(self):
        if self._perimeter == 0:
            self._perimeter = side[1] + side[2] + side[3]
        return self._perimeter
    def setAngle(self, angle, measure):
        self._angle[angle] = float(measure)
    def getAngle(self, angle):
        if self._angle[angle] == 0:
            if angle == 1:
                angle1 = self._angle[2]
                angle2 = self._angle[3]
            elif angle == 2:
                angle1 = self._angle[1]
                angle2 = self._angle[3]
            elif angle == 3:
                angle1 = self._angle[1]
                angle2 = self._angle[2]
            anglet = angle1 + angle2
            angler = float(180) - anglet
            self._angle[angle] = angler
        return self.angle[angle]

Это часть пакета под названием Mathworks. Код вызова такой:

import mathworks as mw
mycircle = mw.shapes.circle()
mycircle.setDiameter(5)
circum = mycircle.getCircumference()
print circim

Когда я пытаюсь запустить второй модуль, я получаю следующее:

Traceback (most recent call last):
  File "<string>", line 254, in run_nodebug
  File "<module1>", line 21, in <module>
  File "<module1>", line 17, in main
  File "C:\Python27\lib\site-packages\mathworks\shapes.py", line 70, in getCircumference
    self._circumference = float(self._diameter * self._pi)
AttributeError: circle instance has no attribute '_pi'

Что случилось? Это работает, если я заменю self._pi на 3.14159265, но мне нужно, чтобы это работало по-другому.


person kirbyfan64sos    schedule 11.03.2013    source источник


Ответы (2)


Вы неправильно назвали свои инициализаторы, для этого нужны двойные символы подчеркивания с обоих концов:

def __init__(self):

Вам нужно исправить это для всех ваших классов.

Поскольку вы назвали их неправильно, они не запускаются, когда вы создаете экземпляр своих классов.

Следующая проблема, с которой вы столкнетесь, это инициализатор triangle; вы не можете обращаться к индексам в пустом списке. Вместо этого создайте весь список за один раз:

def __init__(self):
    self._side = [0, 0, 0, 0]
    self._angle = [0, 0, 0, 0]
    self._perimeter = 0
    self._area = 0
person Martijn Pieters    schedule 11.03.2013
comment
Большое спасибо!!!! Еще одна проблема: теперь в классе Triangle; Я решил сделать это: tri = mw.shapes.triangle(); tri.setAngle(1, 52); tri.setAngle(2, 45); print tri.getAngle(3) Но теперь я получаю это: File "C:\Users\Ryan\Documents\mw-test.py", line 19, in <module> tri.setAngle(1, 52) File "C:\Python27\lib\site-packages\mathworks\shapes.py", line 95, in setAngle angle2 = self._angle[3] AttributeError: triangle instance has no attribute '_angle' - person kirbyfan64sos; 12.03.2013
comment
@kirbyfan64sos: self.angle против self._angle; вам нужно использовать правильное имя атрибута. Последняя строка метода, return self.angle[angle] должна быть return self._angle[angle]. - person Martijn Pieters; 12.03.2013
comment
@MartijnPeters: О. Ok. Но вы видите другую ошибку. Я собирался это исправить. - person kirbyfan64sos; 12.03.2013
comment
@ kirbyfan64sos: Вы уже исправили написание определения функции __init__ для класса? В вашем случае это неправильно, потому что он не запускается. - person Martijn Pieters; 12.03.2013
comment
@MartijnPeters: Да. Странная часть заключается в том, что это назначение угла 2, а не угла 1. Это означает, что первая инструкция работала нормально. - person kirbyfan64sos; 12.03.2013
comment
@kirbyfan64sos: Вы уверены, что перезагрузили свой код? Перезапустите IDLE, я подозреваю, что есть несоответствие между загруженным кодом и файлом на диске. - person Martijn Pieters; 12.03.2013
comment
@MartijnPeters: я использую PyScripter, но то, что вы сказали, все еще работает. Теперь у меня есть еще другая проблема; в моем тестовом модуле, который я разместил, он говорит мне следующее: AttributeError: 'module' object has no attribute 'shapes'. ????? - person kirbyfan64sos; 12.03.2013
comment
@kirbyfan64sos: В mathworks/__init__.py убедитесь, что вы импортируете фигуры. Или сначала импортируйте mathworks.shapes. - person Martijn Pieters; 12.03.2013
comment
@MartijnPeters: я импортировал фигуры. Когда я сделаю то, что вы предложили, это все равно не сработает. Мой файл инициализации находится по адресу pastebin.com/55fgDMJ8. - person kirbyfan64sos; 12.03.2013
comment
@kirbyfan64sos: я вижу здесь закономерность; это __all__ (двойное подчеркивание). В противном случае этот файл выглядит правильно. Убедитесь, что у вас нет локального файла с именем mathworks.py или что-то в этом роде. Посмотрите, что import mathworks; print mathworks.__file__ сообщает вам об импорте. - person Martijn Pieters; 12.03.2013
comment
Спасибо!!! Некоторое время назад я работал над другим математическим модулем, который сохранил в той же папке. Спасибо за совет! - person kirbyfan64sos; 12.03.2013

У вас неправильно написан конструктор. Это должно быть __init__, а не _init_, т.е. двойное подчеркивание.

Поскольку вы написали это неправильно, он не вызывается, поэтому эти атрибуты не создаются при создании экземпляров ваших объектов.

person Jay P.    schedule 11.03.2013