Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/64: Рейтинг темы: голосов - 64, средняя оценка - 4.83
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

Объект не имеет атрибута, хотя он его имеет. Почему так?

16.12.2018, 23:33. Показов 12988. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья! Ковыряюсь в классах. Пытаюсь понять логику поведения как она задумана создателями, ибо в книгах ничего про это не пишут.

Итак, класс:
Python
1
2
3
4
5
6
7
8
9
10
11
12
class Circle():
 
    def __init__(self):
        self.radius = 78
 
    @property
    def radius(self):
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        self.__dius = radius
вывод:
Windows Batch file
1
2
3
4
5
6
>>> import Shap_h
<module 'Shap_h' from 'C:\Shap_h.py'>
>>> z = Shap_h.Circle()
>>> z.radius = 90
>>> z.radius
90
Вот обратите внимание, задействую переменную __dius. И всё нормально

+++++++++++++++++++++++++++++++++++

Теперь я задался целью, если у нас обращение к переменой radius суть вызов либо функции присваивания либо функции чтения (а согласовываются они меж собой с помощью какой-то хитрой переменной __dius), так может вообще попытаться обойтись без этой переменной radius?

Python
1
2
3
4
5
6
7
8
9
10
11
12
class Circle():
 
    def __init__(self):
        self.radius (self, 78)
 
    @property
    def radius(self):
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        self.__dius = radius
как видите, в конструкторе сразу напрямую вызываю radius.setter

Вывод:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
>>> imp.reload(Shap_p)
<module 'Shap_p' from 'C:\Shap_p.py'>
>>> z = Shap_p.Circle()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Shap_p.py", line 4, in __init__
    self.radius (self, 78)
  File "C:\Shap_p.py", line 8, in radius
    return self.__dius
AttributeError: 'Circle' object has no attribute '_Circle__dius'
Вот, как видите, в этом случае почему-то ругается на переменную __dius, типа её нет. Как-то странно, да? В первом коде она есть и даже вполне себе используется, а во втором нет! Почему так? Помогите разобраться, пожалуйста! Спасибо, кто откликнется.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.12.2018, 23:33
Ответы с готовыми решениями:

Объект 'NoneType' не имеет атрибута 'name'
Добрый день, уважаемые знатоки, решил для себя узнать Питон и Джанго, но столкнулся с данной проблемой: при поисковом запросе открывается...

self не имеет атрибута
Я использую multithreading для того, чтобы вызывать функции не в главном потоке, а в другом. Но почему то в функции destroy self не имеет...

QuerySet не имеет атрибута name
При загрузки страницы вылетает ошибка 'QuerySet' object has no attribute 'name'. Что мне исправить? это models.py class...

17
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
17.12.2018, 00:37
Зачем Вы используете reload модуля Shap_p, у Вас что, большой проект с большим количеством модулей, и нельзя запустить сценарий сначала? При перезагрузке отдельного модуля, без перезапуска всего сценария, возникают свои нюансы.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
17.12.2018, 00:47  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Зачем Вы используете reload модуля Shap_p, у Вас что, большой проект с большим количеством модулей, и нельзя запустить сценарий сначала?
ну ладно

Python
1
2
3
4
5
6
7
8
9
>>> import Shap_p
>>> z = Shap_p.Circle()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Shap_p.py", line 4, in __init__
    self.radius (self, 78)
  File "C:\Shap_p.py", line 8, in radius
    return self.__dius
AttributeError: 'Circle' object has no attribute '_Circle__dius'
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
17.12.2018, 01:01
Инициализация в классе у Вас какая то странная. Обычно в классах атрибуты экземплярам задают следующим образом:

Python
1
2
3
4
5
6
7
8
class Circle():
 
    def __init__(self, radius=78):
        self.radius = radius
 
if __name__ == '__main__':
    z = Circle(90) 
    print(z.radius)          # 90
Добавлено через 10 минут
И вообще мне не понятно, что Ваши методы должны делать. И почему оба метода имеют одно название?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
17.12.2018, 01:38  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Обычно в классах атрибуты экземплярам задают следующим образом:
ну так то обычно, а я (второй раз пишу уже) предположил, что

Цитата Сообщение от kravam Посмотреть сообщение
если у нас обращение к переменой radius суть вызов либо функции присваивания либо функции чтения (а согласовываются они меж собой с помощью какой-то хитрой переменной __dius), так может вообще попытаться обойтись без этой переменной radius?
++++++++++++++++++++++++++++++++

Цитата Сообщение от Viktorrus Посмотреть сообщение
И почему оба метода имеют одно название?
какие оба метода?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.12.2018, 08:43
Цитата Сообщение от kravam Посмотреть сообщение
какие оба метода?
Которые геттеры и сеттеры

Вот правильный рабочий код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Circle(object):
    def __init__(self):
        # self.__dius = 0
        self.radius = 78
 
    def _radius_get(self):
        print('hi from getter')
        return self.__dius
    
    def _radius_set(self, r):
        print('hi from setter')
        self.__dius = r
 
    radius = property(_radius_get, _radius_set)
 
a = Circle()
print(a.radius)
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
17.12.2018, 11:16
kravam, У Вас атрибут __dius отсутствует в методе инициализации __init__ или просто в классе, например
Python
1
2
class Circle():
    __dius = 0
Поэтому за пределами класса его не видно. Атрибут __dius появляется только в методе, поэтому и виден только внутри метода. Переменные определенные внутри метода ведут себя так же, как и переменные в функциях, они локальные и видны только внутри функции или метода. Атрибут, это переменная привязанная к объекту.

Добавлено через 24 минуты
kravam, Методы, которые Вы определяете в классе в принципе не нужны. Что бы получить радиус без всякого метода достаточно ввести z.radius. А что бы установить новый радиус, достаточно ввести z.radius = 55

Python
1
2
3
4
5
6
7
8
class Circle(object):
    def __init__(self, radius=78):
        self.radius = radius
 
z = Circle(90)
print(z.radius)
z.radius = 55
print(z.radius)
Вывод:
90
55
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
17.12.2018, 14:03
Цитата Сообщение от kravam Посмотреть сообщение
в конструкторе сразу напрямую вызываю radius.setter
Нет. Здесь первым делом вызывается getter (чтобы разрешить имя self.radius). И даже если вы на этом этапе избежите исключения AttributeError, на следующем, когда питон возьмется за интерпритацию скобок, вывалится TypeError: 'int' object is not callable. А вот в первом куске кода как раз таки setter. Это легко проверить
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Circle():
 
    def __init__(self):
        self.__dius = 9
        self.radius(self, 78)
 
    @property
    def radius(self):
        print('getter', flush=True)
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        print('setter', flush=True)
        self.__dius = radius
 
 
c = Circle()
Чтобы вызвать setter непосредственно, нужно писать
Python
1
Circle.radius.__set__(self, 616)
или
Python
1
Circle.radius.fset(self, 161)
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
17.12.2018, 21:35  [ТС]
Цитата Сообщение от shsv Посмотреть сообщение
Здесь первым делом вызывается getter
пусть так (проверяется легко, просто я не стал загромождать код вызовами print).

Цитата Сообщение от shsv Посмотреть сообщение
Чтобы вызвать setter непосредственно, нужно писать
Наверное, вы правы, до этого я не дошёл ещё. Вот до этого дошёл:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Circle():
 
    def __init__(self):
        self.radius(self, 78)
 
    @property
    def radius(self):
        print('getter')
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        print('setter')
        self.__dius = radius
 
 
c = Circle()
(это код из моего первого поста, кстати)
Вы добавили в него строчку "self.__dius = 9". Типа ругается, что AttributeError: 'Circle' object has no attribute '_Circle__dius' (хотя как по мне _Circle__dius и __dius это разные переменные). Но закроем глаза на это пока.

Ваш код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Circle():
 
    def __init__(self):
        self.__dius = 9
        self.radius(self, 78)
 
    @property
    def radius(self):
        print('getter')
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        print('setter')
        self.__dius = radius
 
 
c = Circle()
Так опять ругается. self.__dius в конструкторе определили? Определили. А теперь он ругается на строчку "self.radius(self, 78)"

Windows Batch file
1
TypeError: 'int' object is not callable
Хотя ниже идёт определение этой функции:
Python
1
2
3
4
    @radius.setter
    def radius(self, radius):
        print('setter')
        self.__dius = radius
Вот что ему надо?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
18.12.2018, 04:56
Цитата Сообщение от kravam Посмотреть сообщение
Вот что ему надо?
Потому что вызвался геттер, если вы не заметили, и он вернул число. Пишите так, да и всё:
Python
1
self.radius = 78
Добавлено через 1 минуту
Или так, если хотите явно вызвать сеттер:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Circle(object):
    def __init__(self):
        # self.__dius = 0
        self._radius_set(78)
 
    def _radius_get(self):
        print('hi from getter')
        return self.__dius
    
    def _radius_set(self, r):
        print('hi from setter')
        self.__dius = r
 
    radius = property(_radius_get, _radius_set)
 
a = Circle()
print(a.radius)
Добавлено через 15 секунд
Внимание на 4-ю строку.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
18.12.2018, 18:21  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Потому что вызвался геттер, если вы не заметили, и он вернул число.
реально ничё не объясняет. Где-то написано что ли, что если вызывается геттер, то сеттер вызваться не может?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
18.12.2018, 18:38
Запустите код — и увидите.
Python
1
self.radius(self, 78)
self.radius — это свойство, и сначала интерпретатор вызывает геттер, чтобы получить настоящее значение переменной (9), а уже полученное значение вызывает: 9.__call__(self, 78). И конечно же у тип int нельзя вызвать, потому и бросается исключение.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
18.12.2018, 19:42  [ТС]
Правильно ли я вас понимаю, что в этом коде:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Circle():
 
    def __init__(self):
        self.__dius = 9
        self.radius(self, 78)
 
    @property
    def radius(self):
        print('getter')
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        print('setter')
        self.__dius = radius
 
 
c = Circle()
интерпретатор python сперва инициализирует self.__dius, а потом, вместо того, чтобы как все нормальные программы принять выражение self.radius(self, 78) за вызов функции (ибо синтаксис это наше всё, а это именно синтаксис вызова функции), он сперва начинает ковыряться в имени, которое, оказывается может быть как именем функции, так и именем всякой другой фигни!

И палит имя self.radius. И это не имя функции потому, что хоть у нас и стоят такие вот определения функций с тем же именем radius:

Python
1
2
3
4
5
6
7
8
9
    @property
    def radius(self):
        print('getter')
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        print('setter')
        self.__dius = radius
Но вот эти вот штучки @property и @radius.setter декорируют (скрывают, проще говоря) имена функций и потому интепретатор не интерпретирует имя self.radius как имя одно из этих функций (но к этому мы ещё вернёмся.)

++++++++++++++++++++++++++++++++++++++++ ++

И интерпретатора делает вывод что это какая-то там переменная self.radius Потом он её устанавливает, что ли (тут вызывается геттер для self.radius). Ну происходит, как если бы мы просто набрали:
Python
1
self.radius
Так, и расценивает эту переменную как int. После чего начинает ковыряться со скобками и ругается:
Windows Batch file
1
TypeError: 'int' object is not callable
++++++++++++++++++++++++++++++++++++++++ +

А теперь вернёмся к тому, у чему хотели вернуться. Действительно, если мы вот этот вот декоратор @radius.setter уберём, то интепретатор расценит self.radius именно как вызов функции и так же и будет с ним работать:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Circle():
 
    def __init__(self):
        self.__dius = 9
        self.radius(self, 78)
 
    @property
    def radius(self):
        print('getter')
        return self.__dius
 
    radius.setter
    def radius(self, radius):
        print('setter')
        self.__dius = radius
 
 
c = Circle()
Вывод:
Windows Batch file
1
TypeError: radius() takes exactly 2 positional arguments (3 given)
, после чего выяснится, что вызов неправильный какой-то. А надо бы так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Circle():
 
    def __init__(self):
        self.__dius = 9
        self.radius(78)
 
    @property
    def radius(self):
        print('getter')
        return self.__dius
 
    radius.setter
    def radius(self, radius):
        print('setter')
        self.__dius = radius
 
 
c = Circle()
Ну вот как-то так.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
18.12.2018, 20:28
Я так и не понял, зачем Вам нужен атрибут __dius, когда у Вас есть атрибут radius, в чем их различие, кроме имени? Хотя скажу честно, декораторы я еще не изучал. Это как то необходимо для декораторов?
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
18.12.2018, 21:07
kravam, в целом верно всё поняли. Осталось вспомнить, что такое декоратор, точнее что он, вчастности, делает с именем (объектом), к которому применяется, и что возвращает propertyproperty.setter).

property - дескриптор. И property.setter возвращает (новый) экземпляр дескриптора property. Т.е. после применения декораторов в вашем классе нет методов radius, совершенно нет, будто их и не определяли вовсе, вместо этого имя radius ссылается на объект дескриптора, который перехватывает все обращения к данному имени. Кстати, метода __call__ у него нет.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
18.12.2018, 21:23  [ТС]
Viktorrus, хорошо, что напомнили. Вернёмся к самому началу.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Circle():
 
    def __init__(self):
        self.radius (self, 78)
 
    @property
    def radius(self):
        print("getter")
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        print("setter")
        self.__dius = radius
 
c = Circle()
Windows Batch file
1
2
AttributeError: 'Circle' object has no attribute '_Circle__dius'
getter
теперь это поведение понятно. Сперва смотрится имя self.radius, интерпретируется как переменная типа int, после чего вызывается getter, в процесе вызова которого атрибут self.__dius не находится, на что и ругань.

++++++++++++++++++++++++++++++++++++++++ +++++

И самый первый код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Circle():
 
    def __init__(self):
        self.radius = 78
 
    @property
    def radius(self):
        print("getter")
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        print("setter")
        self.__dius = radius
 
c = Circle()
Windows Batch file
1
setter
Тут переменная self.radius интерпретируется как int, при присваивании вызывается сеттер, в котором определяется self.__dius = radius, никакой ругани нет.

Только один маленький вопрос остался. Почему не вызывается getter?
Ну у меня один ответ- потому, что такой синтаксис, self.radius = 78 и при таком синтаксисе вызов геттера не происходит, хз почему. Может, оно и не надо, ведь getter нужен, когда мы что-то возвращаем себя, а тут ничего не возвращаем, а просто устанавливаем значение.

В общем так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Circle():
 
    def __init__(self):
 
        #вызывается ТОЛЬКО геттер
        self.radius
 
        #вызывается ТОЛЬКО сеттер
        #self.radius = 78
 
    @property
    def radius(self):
        print("getter")
        return self.__dius
 
    @radius.setter
    def radius(self, radius):
        print("setter")
        self.__dius = radius
 
c = Circle()
++++++++++++++++++++++++++++++++++++++++ ===

Цитата Сообщение от Viktorrus Посмотреть сообщение
Я так и не понял, зачем Вам нужен атрибут __dius, когда у Вас есть атрибут radius, в чем их различие, кроме имени? Хотя скажу честно, декораторы я еще не изучал. Это как то необходимо для декораторов?
не обращай внимания, всё это только исследование и ничего более. Цель- проследить логику авторов создания интерпретатора. Они ведь не описывают, почему оно работает так, а не иначе...
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
19.12.2018, 00:28
Вы начали все по новой, я все по новой объяснять не буду.
Цитата Сообщение от kravam Посмотреть сообщение
логику авторов создания интерпретатора
объясняет М. Лутц в своих книгах, которые уже стали классикой для изучающих питон.
Лутц М. Изучаем Python
Лутц М. Программирование на Python. Том 1, 2
Если хотите разобраться, то изучайте их, там все ответы на Ваши вопросы

Добавлено через 1 минуту
Дальше что то Вам объяснять, когда Вы не знаете основ, я не вижу смысла. Удачи.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
19.12.2018, 15:53  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Вы начали все по новой, я все по новой объяснять не буду.
угу, только одна поправка, я не начал по новой, а ЗАКОНЧИЛ, следовательно, объяснения мне ваши нужны как собаке пятая нога.

А так-то у меня всё есть- лутц и мутц, ещё кто. Если бы я сказал, что читал лутца, вы бы меня ещё куда отправили. Старо, как мир.

Цитата Сообщение от Viktorrus Посмотреть сообщение
Дальше что то Вам объяснять, когда Вы не знаете основ, я не вижу смысла. Удачи.
долго думал. Ну да, я не знаю основ. Так и вы их не знаете, судя по всему. По крайней мере, из ваших ответов это не видно. То, что у вас они вопросов не вызывают, говорит только о том, что вам неинтересно, как оно работает. Ваши дела.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2018, 15:53
Помогаю со студенческими работами здесь

Модуль 'sklearn' не имеет атрибута 'cross_validation'
Пытаюсь разбить свой набор данных, но я получаю эту ошибку: ImportError: cannot import name 'cross_validation' from 'sklearn'...

Какую связь имеет запущенная программа со своим исполняемым файлом? Почему его нельзя удалить?
Привет! Просто интересно, ну вот допустим я запускаю EXE файл, по идее программы же полностью выгружается из него в память, так почему я...

2. Какую структуру имеет объект динамического класса, в чем заключаются его особенности? 3. Объясните Особенности Исполн
2. Какую структуру имеет объект динамического класса, в чем заключаются его особенности? 3. Объясните Особенности Исполнение операции...

В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты...

Имеет ли магнитное поле свой спектр излучения, так имеет ли обыкновенный магнит свой спектр излучения?
Имеет ли магнитное поле свой спектр излучения, так имеет ли обыкновенный магнит свой спектр излучения? Имеют ли магнитные токи свой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru