С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594

Не могу посмотреть Атрибут Класса Дескриптора

23.03.2024, 11:32. Показов 462. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
- Есть простой пример применения Дескриптора (см. код ниже). В классе-Владельца (Flds) создан единственный
экземпляр класса-Дескриптора (Fld) - FLD. Все работает хорошо и вроде бы правильно.
В классе-Дескриптора есть Атрибут-Класса (NDF_NUM). Не могу посмотреть его в конце программы.
Подскажите, пожалуйста, как это сделать?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# (возможные Значения Поля)
NDF = 'NDF'
OCC = 'OCC'
EMP = 'EMP'
 
 
class Fld:  # класс-Поле - Дескриптор
    NDF_NUM = 0  # (Число НЕОПРЕДЕЛЕННЫХ Полей (NDF))
 
    def correct_num(self, instance, value):  # корректировка - Числа НЕОПРЕДЕЛЕННЫХ Полей
        # (Словарь Локальных Свойств)
        loc_dict = instance.__dict__
        # (изначально Словарь Локальных Свойств - ПУСТ)
        if loc_dict == {} or loc_dict[self.name] != value:
            # (.....)
            if value != NDF:
                self.NDF_NUM -= 1
            else:
                self.NDF_NUM += 1
                print(f"***  NDF_NUM: {self.NDF_NUM},  value: {value}")
 
    def __set_name__(self, owner, name):  # (уникальное Имя Локального Параметра)
        # print(f'***  <__set_name__>  self: {self},  owner: {owner},  name: {name}')  # (посмотреть - Смысл Параметров)
        self.name = "_" + name
 
    def __get__(self, instance, owner):  # (геттер)
        # print(f'***  <__get__>  self: {self},  instance: {instance},  owner: {owner}')  # (посмотреть - Смысл Параметров)
        # (аналог: - return instance.__dict__[self.name])
        return getattr(instance, self.name)
 
    def __set__(self, instance, value):  # (сеттер)
        # print(f'***  <__set__>  self: {self},  instance: {instance},  value: {value}')  # (посмотреть - Смысл Параметров)
        self.correct_num(instance, value)  # (проверка Параметра на Целое Число)
        # (аналог: - instance.__dict__[self.name] = value)
        setattr(instance, self.name, value)
 
    def get_NDF_NUM(self):
        return self.NDF_NUM
 
 
class Flds:  # класс-Владелец (Контейнер)
    # (Дескриптор)
    FLD = Fld()
 
    def __init__(self):
        # (инициализация Дескриптора)
        self.FLD = NDF
 
 
# обращение:
flds = Flds()
print(flds)  # -> <__main__.Flds object at 0x000001C412D522D0>  (Экземпляр Класса-'Flds')
print(flds.FLD)  # -> NDF  (чтение)
 
flds.FLD = OCC  # (запись)
print(flds.FLD)  # -> OCC  (чтение)
print(flds.__dict__)  # -> {'_FLD': 'NDF'}  (Словарь Локальных Свойств)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2024, 11:32
Ответы с готовыми решениями:

Атрибут класса ведет себя по разному, когда ссылается на self и на название класса
Когда рассматривал атрибуты классов, заметил, что если, если атрибут класса ссылается с названием класса, то при создании разных объектов...

Создать пользовательский атрибут, позволяющий хранить в метаданных класса имя разработчика и дату разработки класса
Составьте пользовательскую библиотеку и программу с её использованием, решающие задачу в C#. В разработанной программе...

Атрибут id и атрибут класса
Здравствуйте.Установил плагин Contact Form 7 ,с помощью него можно создавать простейшие формы для отправки заявок.Когда люди закончили...

3
 Аватар для zur9x
8 / 11 / 2
Регистрация: 17.04.2021
Сообщений: 72
23.03.2024, 21:44
Какие данные на выходе вы ждете?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
24.03.2024, 09:52
Лучший ответ Сообщение было отмечено Staut как решение

Решение

zur9x, подозреваю, что так:
Python
1
2
print(flds.FLD.NDF_NUM)
print(flds.FLD.get_NDF_NUM())
Добавлено через 29 минут
Короче, мне пришлось прочитать всё руководство https://docs.python.org/3/howto/descriptor.html
……………

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from enum import StrEnum, verify, UNIQUE
 
@verify(UNIQUE)
class Fld(StrEnum):
    """возможные Значения Поля"""
    NDF = 'NDF'
    OCC = 'OCC'
    EMP = 'EMP'
 
 
# Число НЕОПРЕДЕЛЕННЫХ Полей (NDF)
NDF_NUM = 0
 
class Field:
    """класс-Поле - Дескриптор"""
 
    def __set_name__(self, owner, name):
        self.private_name = '_' + name
 
    def __get__(self, obj, objtype=None):
        return getattr(obj, self.private_name)
 
    def __set__(self, obj, value):
        self.validate(obj, value)
        setattr(obj, self.private_name, value)
 
    def validate(self, obj, value):
        global NDF_NUM
        old_value = getattr(obj, self.private_name, None)
        if old_value == Fld.NDF and value != Fld.NDF:
            NDF_NUM -= 1
        elif old_value != Fld.NDF and value == Fld.NDF:
            NDF_NUM += 1
 
 
class Flds:
    """класс-Владелец (Контейнер)"""
    # Дескриптор
    fld = Field()
 
    def __init__(self):
        # инициализация Дескриптора
        self.fld = Fld.NDF
 
 
# обращение:
flds = Flds()
print(NDF_NUM)
print(flds)  # -> <__main__.Flds object at 0x000001C412D522D0>  (Экземпляр Класса-'Flds')
print(flds.fld)  # -> NDF  (чтение)
 
flds.fld = Fld.OCC  # (запись)
print(flds.fld)  # -> OCC  (чтение)
print(flds.__dict__)  # -> {'_FLD': 'NDF'}  (Словарь Локальных Свойств)
print(NDF_NUM)
Добавлено через 7 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from enum import StrEnum, verify, UNIQUE
 
@verify(UNIQUE)
class Fld(StrEnum):
    """возможные Значения Поля"""
    NDF = 'NDF'
    OCC = 'OCC'
    EMP = 'EMP'
 
 
class Field:
    """класс-Поле - Дескриптор"""
 
    def __set_name__(self, obj, name):
        self.private_name = '_' + name
        self.count_ndf = '_count_ndf'
        # Число НЕОПРЕДЕЛЕННЫХ Полей (NDF)
        setattr(obj, self.count_ndf, 0)
 
    def __get__(self, obj, objtype=None):
        return getattr(obj, self.private_name)
 
    def __set__(self, obj, value):
        self.validate(obj, value)
        setattr(obj, self.private_name, value)
 
    def validate(self, obj, value):
        old_value = getattr(obj, self.private_name, None)
        if old_value == Fld.NDF and value != Fld.NDF:
            count_ndf = getattr(obj, self.count_ndf)
            count_ndf -= 1
            setattr(obj, self.count_ndf, count_ndf)
        elif old_value != Fld.NDF and value == Fld.NDF:
            count_ndf = getattr(obj, self.count_ndf)
            count_ndf += 1
            setattr(obj, self.count_ndf, count_ndf)
 
 
class Flds:
    """класс-Владелец (Контейнер)"""
    # Дескриптор
    fld = Field()
    fld2 = Field()
 
    def __init__(self):
        # инициализация Дескриптора
        self.fld = Fld.NDF
        self.fld2 = Fld.NDF
 
 
# обращение:
flds = Flds()
print(flds.__dict__)
print(flds.fld)  # -> NDF  (чтение)
 
flds.fld = Fld.OCC  # (запись)
print(flds.fld)  # -> OCC  (чтение)
print(flds.__dict__)  # -> {'_FLD': 'NDF'}  (Словарь Локальных Свойств)
1
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
24.03.2024, 11:47  [ТС]
- ОГРОМНОЕ СПАСИБО "Рыжий Лис"! А то я уже отчаялся.
- По поводу первого Вашего варианта:
Я не смог добраться до Атрибута-Класса (NDF_NUM) Класса-Дескриптора - (Fld) ни через Экземпляр Класса (fld),
ни через Сам Класс (Fld).
Не сообразил, что можно ВЫНЕСТИ этот Атрибут-Класса (NDF_NUM) из Класса-Дескриптора !!! Да появилась
Глобальная Переменная (NDF_NUM), но в некоторых случаях это ТЕРПИМО !!! Одним словом это РЕШЕНИЕ ПРОБЛЕМЫ!

- По поводу второго Вашего примера:
Вы, видимо, хотели избавиться от Глобальной Переменной (NDF_NUM), заменив ее на Атрибут Экземпляра Класса
(self.count_ndf). По моему тут пока еще что-то не так ...
Одним словом Вы дали много материала, над которым можно МНОГО ПОДУМАТЬ. Еще раз - ОГРОМНОЕ СПАСИБО !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.03.2024, 11:47
Помогаю со студенческими работами здесь

Как можно изменить атрибут экземпляра одного класса при добавлении/изменении экземпляра другого класса
Мне нужно, чтобы при создании города/деревни уже существующей области (т.е. уже создана область с таким названием) изменялись атрибуты...

В чем различия дескриптора,полученного из WinAPI функций и дескриптора, полученного из свойства Handle в классе Process?
Можно ли использовать дескриптор окна,полученный с помощью свойства Handle в классе Process для того что бы ,например, записать значение по...

Как создать атрибут экземпляра класса в методе экземпляра класса?
Здравствуйте. Подскажите, как в javascript создать новый атрибут экземпляра класса в методе экземпляра? class YandexMap{ //...

Пропавший атрибут self у экземпляра класса
Управляющая программа: #! usr/bin/env/python3 import shelve as crt import alfalist as alf all=crt.open('termbd') ...

Атрибут при сериализации класса
Добрый день. Есть xml который я хочу получить после сериализации класса public class Document { } &lt;Document...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru