Найти - Пользователи
Полная версия: Определение свойста
Начало » Python для новичков » Определение свойста
1 2
megoloman
Здравствуйте! Помогите пожалуйста со следующей проблемой.
Есть класс:
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.
Как можно это сделать?
ayb
>>> 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
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

Но при создании экземпляра
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
JOHN_16
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
Ваша ошибка в том что у вас аттрибут класса и свойство имеют одно и тоже имя, чего быть не должно, потому что одно заменяется другим и логика работы нарушена
megoloman
Исправил, ошибка исчезла:
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
не работает, я могу любое значение установить
ayb
Покажите код как устанавливаете значение, не может такого быть.
megoloman
order = Order(102,2,3)
order.discount = 103
ayb
Вы вообще понимаете что такое property и как это работает ?
megoloman
видимо не совсем( можете объяснить?
ayb
Вы можете объяснить зачем Вам property ? Установку атрибута можно контролировать в методе __setattr__
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB