Уведомления

Группа в Telegram: @pythonsu

#1 Март 22, 2016 16:51:17

megoloman
Зарегистрирован: 2015-10-26
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение свойста

Здравствуйте! Помогите пожалуйста со следующей проблемой.
Есть класс:

class Order():
def __init__(self, discount, total_price, date):
self.discount = discount
self.total_price = total_price
self.date = date

Мне необходимо сделать атрибут Order.discount свойством (property) и ограничить диапозоном значений 0…99.
Как можно это сделать?

Отредактировано megoloman (Март 22, 2016 16:53:12)

Офлайн

#2 Март 22, 2016 18:31:47

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Определение свойста

>>> class A:
...   def __init__(self, value):
...     self.__value = value
...   @property
...   def value(self):
...     return self.__value
...   @value.setter
...   def value(self, new_value):
...     if 0 < new_value < 99:
...       self.__value = new_value
...     else:
...       raise ValueError

Офлайн

#3 Март 22, 2016 20:38:31

megoloman
Зарегистрирован: 2015-10-26
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение свойста

Добавил:

class Order():
def __init__(self, discount, total_price, date):
self.discount = discount
self.total_price = total_price
self.date = date

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

@discount.setter
def discount(self, set_discount):
if 0 < set_discount < 99:
self.discount = set_discount
else:
raise ValueError

Но при создании экземпляра
order = Order(1,2,3)
происходит ошибка:
  File "untitled.py", line 30, in discount
self.discount = set_discount
File "untitled.py", line 30, in discount
self.discount = set_discount
File "untitled.py", line 30, in discount
self.discount = set_discount
File "untitled.py", line 30, in discount
self.discount = set_discount
File "untitled.py", line 30, in discount
self.discount = set_discount
File "untitled.py", line 30, in discount
self.discount = set_discount
File "untitled.py", line 30, in discount
self.discount = set_discount
RuntimeError: maximum recursion depth exceeded

Офлайн

#4 Март 22, 2016 21:11:49

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Определение свойста

megoloman
вы не внимательны к деталям:

class Order:
    def __init__(self, discount, total_price, date):
        self.__discount = discount 
        self.total_price = total_price
        self.date = date
        
    @property
    def discount(self):
        return self.__discount
    
    @discount.setter
    def discount(self, set_discount):
        if 0 < set_discount < 99:
            self.__discount = set_discount
        else:
            raise ValueError
Ваша ошибка в том что у вас аттрибут класса и свойство имеют одно и тоже имя, чего быть не должно, потому что одно заменяется другим и логика работы нарушена



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Март 22, 2016 21:31:48

megoloman
Зарегистрирован: 2015-10-26
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение свойста

Исправил, ошибка исчезла:

class Order(list):
def __init__(self, discount, total_price, date):
self.discount = discount
self.total_price = total_price
self.date = date

@property
def set_discount(self):
return self.discount

@set_discount.setter
def set_discount(self, new_discount):
if 0 < new_discount < 99:
self.discount = new_discount
else:
raise ValueError

Однако ограничение
0 < new_discount < 99
не работает, я могу любое значение установить

Отредактировано megoloman (Март 22, 2016 21:33:05)

Офлайн

#6 Март 22, 2016 21:53:59

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Определение свойста

Покажите код как устанавливаете значение, не может такого быть.

Отредактировано ayb (Март 22, 2016 21:54:43)

Офлайн

#7 Март 22, 2016 21:58:06

megoloman
Зарегистрирован: 2015-10-26
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение свойста

order = Order(102,2,3)
order.discount = 103

Офлайн

#8 Март 22, 2016 22:09:33

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Определение свойста

Вы вообще понимаете что такое property и как это работает ?

Офлайн

#9 Март 22, 2016 22:10:43

megoloman
Зарегистрирован: 2015-10-26
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение свойста

видимо не совсем( можете объяснить?

Офлайн

#10 Март 22, 2016 22:14:25

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Определение свойста

Вы можете объяснить зачем Вам property ? Установку атрибута можно контролировать в методе __setattr__

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version