Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2015 02:49:11

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

vanished

И все-таки. Все равно это соглашения. Ведь никто не запретит пользователю сделать так:

class A:
    _x = 1
    y, z = 2, 3
     
    @property
    def x(self):
        return self._x
 
class B:
    _x = 1
    y, z = 2, 3
     
    @property
    def x(self):
        return self._x
 
def f():
    a = A()
    b = B()
    return a.x + b.x + a.y
 
f()

Не будешь же все атрибуты класса выбивать в property? Этот механизм просто позволяет сделать некоторые, наиболее значимые для внутреннего использования (как я понимаю) атрибуты свободными для изменения.

Офлайн

#2 Март 13, 2015 02:51:52

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

vanished

py.user.next
Для внутреннего использования применяются обычные атрибуты. Свойство - это то, что выставляется наружу, это как методы get и set, совмещённые в одном имени.

Хм. Не понял вообще. Так для пользователя и разницы, собственно, никакой фактически нет. Условно и атрибуты и “свойства” при доступе к экземпляру класса практически ничем не отличаются.

Офлайн

#3 Март 13, 2015 02:59:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

vanished

4kpt_III
Так для пользователя и разницы, собственно, никакой фактически нет.
Если он так сделает, то изменения в классе сломают его программу. Если это его классы, то он менять их не сможет.

Пользователь может и так написать:
a = 1
b = 2
 
def f():
    return a + b
 
f()
это же его проблемы.



Отредактировано py.user.next (Март 13, 2015 03:00:01)

Офлайн

#4 Март 13, 2015 03:01:00

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

vanished

Не-не-не. Как пользователю узнать, что x Вы определили как “свойство”, а y и z - это обычные атрибуты и он их меняет опять на свой страх и риск? И никаких гарантий работоспособности Вашего решения при их изменении или использовании в его коде Вы не даете? Код читать?

Отредактировано 4kpt_III (Март 13, 2015 03:01:21)

Офлайн

#5 Март 13, 2015 03:05:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

vanished

4kpt_III
Как пользователю узнать, что x Вы определили как “свойство”
Легко, x обязательно описывается в документации, а y и z - по усмотрению.

class A:
    _x = 1
    y, z = 2, 3
     
    @property
    def x(self):
        """hello"""
        return self._x

help(A)
Help on class A in module __main__:

class A(builtins.object)
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
|
| x
| hello
|
| ----------------------------------------------------------------------
| Data and other attributes defined here:
|
| y = 2
|
| z = 3



Офлайн

#6 Март 13, 2015 03:09:01

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

vanished

docstring. И вправду. Обычный атрибут его лишен…

И последний вопрос. Что чаще всего выносится на “свойства”? Есть-ли какой-то общий подход в этом вопросе?

Офлайн

#7 Март 13, 2015 03:16:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

vanished

4kpt_III
Что чаще всего выносится на “свойства”?
wiki. свойство



Офлайн

#8 Март 13, 2015 03:22:32

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

vanished

Мда. Это я уже и так глянул. Покопаюсь сам.

Отредактировано 4kpt_III (Март 13, 2015 03:22:48)

Офлайн

#9 Март 13, 2015 05:07:58

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

vanished

Alen
С чего вы это взяли? Ну если я дал ссылку на PEP8, где собственно это соглашение и описано, вы думаете я его не читал?
Я думаю, вы не очень понимаете , зачем оно надо.
Возьмём конкретный пример - фреймворк Django. С его ОРМ мы можем работать как то так:
obj = model.objects.get(pk=pk)
for name, value in model_to_dict(obj).iteritems():
     verbose_name = getattr(obj._meta.get_field(name), "verbose_name", None)
obj._meta - вот в этом месте я использую атрибут класса, не предназначенный для того, чтобы я его использовал. Разработчики джанги меня предупреждают: не трогай! не лезь! Завтра мы выкатим незначительное обновление, которое к хренам собачьим убьёт весь твой код, потому что по только нам известным соображениям мы переименуем метод get_field или перенесем его куда-нибудь в другое место.
Вот так вот нам хочется. А для тебя (для меня то есть) есть куча методов и свойств без подчеркивания,
это документированные свойства и методы, сигнатуры которых мы не будем изменять ради обратной совместимости. Поскольку я использую джангу извращенным способом и пытаюсь от неё добиться того, чего она не умеет, я на свой страх и риск обращаюсь к атрибутам с подчеркиванием.
Другой пример - свойство query. Мы пишем как то так
queryset = MyModel.objects.all()
У полученного объекта queryset есть свойство query. Это свойство только для чтения. Зачем оно нужно? Да для отладки, особого практического смысла в том, чтобы увидеть SQL-код запроса нет, кроме случаев, когда что-то пошло не так и мы разбираемся, какого же чёрта запрос возвращает не то, что нужно. Понятно, что изменять это свойство нельзя ни в коем случае.



Офлайн

#10 Март 13, 2015 23:13:43

tz4678@gmail.com
Зарегистрирован: 2014-12-07
Сообщения: 71
Репутация: +  -2  -
Профиль   Отправить e-mail  

vanished

vanished

Отредактировано tz4678@gmail.com (Авг. 1, 2020 15:49:32)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version