Найти - Пользователи
Полная версия: Изменение состояния неизвестной переменной объекта.
Начало » Python для новичков » Изменение состояния неизвестной переменной объекта.
1 2 3 4 5 6 7
MiK
Вот так выглядит код если ты собираешься изменить заранее известную переменную:
# coding=utf-8
class НекийКласс:
    def увеличить_переменную(self):
        self.а += 1
 
объект = НекийКласс()
объект.а = 1
объект.увеличить_переменную()

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

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

P.S. Создавать атрибут после создания экземпляра класса (объекта) не очень хороший тон…
MiK
4kpt_III
Каким образом я его изменю явно, если не могу указать какой именно надо обработать?
Alen
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
Alen
MiK
Каким образом я его изменю явно, если не могу указать какой именно надо обработать?

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

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

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!
MiK
4kpt_III
Ну да ладно! Для чего же тогда ООП???
MiK
Может есть какой-то декоратор вроде setter?
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