Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2015 11:38:13

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Изменение состояния неизвестной переменной объекта.

Вот так выглядит код если ты собираешься изменить заранее известную переменную:

# coding=utf-8
class НекийКласс:
    def увеличить_переменную(self):
        self.а += 1
 
объект = НекийКласс()
объект.а = 1
объект.увеличить_переменную()

А если я хочу, чтобы один метод обрабатывал много разных переменных? Сейчас у меня есть только такой вариант:
class НекийКласс:
    def увеличить_переменную(self, переменная):
        переменная += 1
        return переменная
 
объект = НекийКласс()
объект.а = 1
объект.а = объект.увеличить_переменную(объект.а)

На практике этот способ оказался ужасно неудобным, особенно если в теле метода есть цикл с запросом к пользователю. Как объяснить методу какую переменную я хочу изменить? И в дальнейшем менять её напрямую внутри метода?

Отредактировано MiK (Фев. 4, 2015 11:48:19)

Офлайн

#2 Фев. 4, 2015 11:51:12

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

Изменение состояния неизвестной переменной объекта.

Начнем с того, что это не переменная, а атрибут. Ну и сам вопрос напрашивается. Почему не хотите менять атрибут явно? Если Вы знаете, что атрибут существует, так поменяйте его значение явно и не мучайтесь.

P.S. Создавать атрибут после создания экземпляра класса (объекта) не очень хороший тон…

Отредактировано 4kpt_III (Фев. 4, 2015 11:51:39)

Офлайн

#3 Фев. 4, 2015 13:16:03

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Изменение состояния неизвестной переменной объекта.

4kpt_III
Каким образом я его изменю явно, если не могу указать какой именно надо обработать?

Офлайн

#4 Фев. 4, 2015 13:43:20

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Изменение состояния неизвестной переменной объекта.

4kpt_III
P.S. Создавать атрибут после создания экземпляра класса (объекта) не очень хороший тон…

Абсолютно верно.

>>> class A:
...     def __init__(self):
...         self.a = 1
>>> a = A()
>>> a.a
1
>>> a.a + 1
2
>>> a.b = 2
>>> a.c = 100500
>>> a.d = a.b - a.c
>>> a.d
 -100498
>>> a.__dict__
{'a': 1, 'b': 2, 'c': 100500, 'd': -100498}
>>> a.__dict__['a'] = 8

Офлайн

#5 Фев. 4, 2015 13:49:49

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Изменение состояния неизвестной переменной объекта.

MiK
Каким образом я его изменю явно, если не могу указать какой именно надо обработать?

Если у вас возникает такая проблема, то дело в плохой архитектуре модуля приложения, стоит серьезно подумать о рефакторинге кода.

Офлайн

#6 Фев. 4, 2015 13:59:33

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Изменение состояния неизвестной переменной объекта.

Alen
Спасибо, не знал про __dict__
Но на первый взгляд, это тоже не очень удобно. Я так понимаю вариантов больше нет, передавать только словари или списки и изменять с помощью их методов вроде список.append(чегототам)?

Почему так сделано?

Офлайн

#7 Фев. 4, 2015 14:01:44

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

Изменение состояния неизвестной переменной объекта.

MiK
Потому как класс в ООП вообще-то не для этого

Офлайн

#8 Фев. 4, 2015 14:03:47

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Изменение состояния неизвестной переменной объекта.


MiK
Я так понимаю вариантов больше нет, передавать только словари или списки

Списки, только если переопределен метод __slots__ .

MiK
Почему так сделано?

>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Офлайн

#9 Фев. 4, 2015 14:06:07

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Изменение состояния неизвестной переменной объекта.

4kpt_III
Ну да ладно! Для чего же тогда ООП???

Отредактировано MiK (Фев. 4, 2015 14:06:29)

Офлайн

#10 Фев. 4, 2015 14:07:41

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Изменение состояния неизвестной переменной объекта.

Может есть какой-то декоратор вроде setter?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version