Преобразование классов свойств в Python

мой класс LabelledPoint наследуется от моего класса Point. Я хочу, чтобы у этого класса были координаты x и y и атрибут метки, который будет строкой.

import numbers
def clamp(v,_min,_max):
    return max(min(v,_max),_min)

class Point:
    def __init__(self,x,y):
        self.x = clamp(x,0,10)
        self.y = clamp(y,0,10)

    def __str__(self):
        return(str((self.x,self.y)))
    @property
    def _add_(self,p):
        a=self.x + p.x
        b=self.y + p.y
        return Point(a,b)

    @property
    def x(self):
        return self.__x
    @x.setter
    def x(self, value):
        if not isinstance(value, numbers.Number):
            raise AttributeError()
        self.__x = clamp(int(value), 0, 10)

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

    @y.setter
    def y(self, value):
        if not isinstance(value, numbers.Number):
            raise AttributeError()
        self.__y = clamp(int(value), 0, 10)

class LabelledPoint(Point):

        def __init__(self,x,y,label):
            Point.__init__(self,x,y)
            label=str()
            self.label=label

        def __str__(self):
            return (str((self.label)))

        def _get_label(self):
            return self._label

        def _set_label(self,label):
            raise AttributeError()
            label=property(_get_label,_set_label)
            return label

Я хочу получить этот ввод:

lp = LabelledPoint(5,15, "foo")
print (lp) # output "(5,10) : foo"

Я получаю только вывод:

(5,10)

Я не знаю в чем моя ошибка Спасибо

В вашем методе _str_ есть только один знак подчеркивания. Он также ничего не делает со значением Point.__str__(self).

Patrick Haugh 17.07.2018 22:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
39
2

Ответы 2

def __str__(self):
    return '{} : {}'.format(Point.__str__(self), self.label)

Your _str_ method only has single underscores around it. It also doesn't do anything with the value Point.__str__(self)

  • @Patrick Haugh

(сам не могу сказать лучше)

Я редактировал код, не знаю, почему код работает, но не компилируется

bryan tetris 17.07.2018 22:45

Я также добавляю две другие функции

bryan tetris 17.07.2018 22:47

В вашем коде было довольно много ошибок (см. Комментарии):

import numbers


def clamp(v, _min, _max):
    return max(min(v, _max), _min)


class Point:
    def __init__(self, x, y):
        self._x = clamp(x, 0, 10)    # changed from no underscore to single underscore 
        self._y = clamp(y, 0, 10)

    def __str__(self):               # added explicit return of the class name
        return f"{self.__class__.__name__}{str((self._x, self._y))}"

    def __add__(self, p):            # changed from double underscore to single underscore, and removed the @property
        a = self._x + p._x
        b = self._y + p._y
        return self.__class__(a, b)  # use super() i/o explicit class

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

    @x.setter
    def x(self, value):              # changed from double underscore to single underscore everywhere below this point
        if not isinstance(value, numbers.Number):
            raise AttributeError()
        self._x = clamp(int(value), 0, 10)

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

    @y.setter
    def y(self, value):
        if not isinstance(value, numbers.Number):
            raise AttributeError()
        self._y = clamp(int(value), 0, 10)


class LabelledPoint(Point):

    def __init__(self, x, y, label):
        super().__init__(x, y)        # calling super() i/o explicit class
        self._label = str(label)      # assign label to attribute

    def __str__(self):                # call to super(), then concatenate the label value
        return f"{super().__str__()}: {str(self._label)}"

    def get_label(self):              # remove single underscore from getter and setter
        return self._label            # why not use @property like in the superclass?

    def set_label(self, label):       # remove raise exception that made th code unreachable
        self._label = label


if __name__ == '__main__':
    p = Point(2, 12)
    print(p)
    lp = LabelledPoint(5, 15, "foo")
    print(lp)

выход:

Point(2, 10)
LabelledPoint(5, 10): foo

Большое спасибо за ваши объяснения с комментариями !!

bryan tetris 17.07.2018 23:18

Другие вопросы по теме