Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
1 / 1 / 0
Регистрация: 04.03.2019
Сообщений: 70

Как создать класс с динамическими атрибутами

04.10.2020, 09:11. Показов 5098. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день! Помогите сделать по типу:

Python
1
print(class.atr)
вывод: atr
Python
1
print(class.one.two)
вывод:
one.two


Как в библиотеки vk_api при работе с методами
Python
1
vk.ads.getCampaigns(account_id=43534654])
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2020, 09:11
Ответы с готовыми решениями:

Создать в Python класс User с атрибутами
Создать в Python класс User с атрибутами: • name (имя) • surname (фамилия) • year_of_birth (год рождения) Класс должен содержать...

Как создать класс матрица с атрибутами private!
Описать класс матрица в которой содержатся следующие атрибуты: private-3 матрицы одинаковой размерности три на три и методы класса...

Использование типов DataContract с другими атрибутами. Прокси класс не генерирует DataContract с атрибутами
Такая проблема. Три дня провозился с сервисом, клиент которого по непонятной мне тогда причине кидал Exception, хотя все было написано...

31
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
04.10.2020, 09:31
Цитата Сообщение от _shut_ Посмотреть сообщение
Помогите сделать по типу:
но зачем? какой в этом смысл? для чего при вызове атрибута возвращать не его значение, а само имя атрибута?
0
1 / 1 / 0
Регистрация: 04.03.2019
Сообщений: 70
04.10.2020, 09:32  [ТС]
Welemir1, это так, тестово. У меня будет класс для работы с API, и туда я буду пихать метод ( как в vk_api ) и параметры
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
04.10.2020, 09:35
Цитата Сообщение от _shut_ Посмотреть сообщение
это так, тестово.
я не против, друг, я самого смысла не улавливаю -для чего это может быть нужно?

скажем вот это
Цитата Сообщение от _shut_ Посмотреть сообщение
print(class.atr)
вывод: atr
сделать легко, а вот
Цитата Сообщение от _shut_ Посмотреть сообщение
print(class.one.two)
уже придется покумекать.
Так вот и вопрос стоит ли кумекать если польза сомнительна? я не про себя, а про тебя, тебе это точно зачем то может пригодиться?
0
1 / 1 / 0
Регистрация: 04.03.2019
Сообщений: 70
04.10.2020, 09:48  [ТС]
Welemir1, да, очень надо

Добавлено через 5 минут
надо например
Python
1
Api.globalMethod.Method(**kwargs)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
04.10.2020, 09:50
Цитата Сообщение от _shut_ Посмотреть сообщение
очень надо
то есть сформулироват пользу не получается?
ну ок, не буду мучать, переопределяй у своего класса магические методы __getattr__ и __getattribute__

Добавлено через 34 секунды
Цитата Сообщение от _shut_ Посмотреть сообщение
Api.globalMethod.Method(**kwargs)
не понимаю, прямо скажи что такого в этом примере? ну вызваны какие то методы, и? что ты тут видишь?
0
1 / 1 / 0
Регистрация: 04.03.2019
Сообщений: 70
04.10.2020, 09:55  [ТС]
Welemir1, хочу что-бы была гибкая система.
Есть в API метод, я передаю его Api.method(), без функций, и передаю параметры в виде **kwargs

пример из vk_api

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
class VkApiMethod(object):
    """ Дает возможность обращаться к методам API через:
 
    >>> vk = VkApiMethod(...)
    >>> vk.wall.getById(posts='...')
    или
    >>> vk.wall.get_by_id(posts='...')
    """
 
    __slots__ = ('_vk', '_method')
 
    def __init__(self, vk, method=None):
        self._vk = vk
        self._method = method
 
    def __getattr__(self, method):
        if '_' in method:
            m = method.split('_')
            method = m[0] + ''.join(i.title() for i in m[1:])
 
        return VkApiMethod(
            self._vk,
            (self._method + '.' if self._method else '') + method
        )
 
    def __call__(self, **kwargs):
        for k, v in six.iteritems(kwargs):
            if isinstance(v, (list, tuple)):
                kwargs[k] = ','.join(str(x) for x in v)
 
        return self._vk.method(self._method, kwargs)
Добавлено через 2 минуты
AttributeError: 'NoneType' object has no attribute 'gfs'

Python
1
senler.met.gfs
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
04.10.2020, 09:57
Цитата Сообщение от _shut_ Посмотреть сообщение
AttributeError: 'NoneType' object has no attribute 'gfs'
вполне понятно, у Нан нет атрибутов, тебе без знания ООП не решить эту проблему. Советую книгу Марка Лутца "Изучаем Питон", раздел ООП.

Цитата Сообщение от _shut_ Посмотреть сообщение
пример из vk_api
почему по этому примеру не сделать?
1
1 / 1 / 0
Регистрация: 04.03.2019
Сообщений: 70
04.10.2020, 10:10  [ТС]
Welemir1, не могу понять что и как там
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
04.10.2020, 10:16
_shut_, Мне лень вникать в то, зачем Вам это нужно. Однако зацепился за слова
Цитата Сообщение от _shut_ Посмотреть сообщение
с динамическими атрибутами
Я не хочу вникать в Ваш код, просто поясните, что Вы понимаете под динамическими атрибутами? Это динамически изменяющиеся значения атрибутов или динамическое создание новых атрибутов, имена которых заранее не известны? То есть динамически создаются имена атрибутов? Так как имя атрибута это так же является переменной, как и простые переменные, но связано с некоторым объектом. Такие имена переменных называются квалифицированными переменными. Если Вам нужно именно последнее, то объясню как динамически создавать новые переменные, если имя этой переменной мы получаем в виде строки только уже в ходе выполнения программы. Если же Вам нужно что то другое, то тогда я пас.
1
1 / 1 / 0
Регистрация: 04.03.2019
Сообщений: 70
04.10.2020, 10:18  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
динамическое создание новых атрибутов, имена которых заранее не известны
Да, это именно что мне надо
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
04.10.2020, 10:45
Сейчас опишу как динамически создавать новые переменные. Проверено на примерах. Но для атрибутов не проверял, но скорее всего тоже будет работать, так как атрибут это такая же переменная, но только прикрепленная к другой переменной.
Но нужно будет поэкспериментировать. Проверять будем параллельно и Вы и я , после того, как я опишу метод для простой переменной.

Добавлено через 19 минут
_shut_, Начиная с версии 3.8 для создания новой переменной внутри выражения можно использовать оператор := . (мое прим. Однако он не позволяет динамически создавать переменную из текстовой строки, как это можно сделать с помощью exec() . То есть при использовании оператора := мы должны заранее знать имя переменной, хотя она и создается динамически только в момент использовании выражения содержащего оператор := ).

(мое прим. С помощью функции exec() можно автоматически из строки создавать новые динамические переменные).
Кстати функция evel() не позволяет этого сделать, так как не разрешает помещать в текстовую строку символ "=". Встречая его там, выдает ошибку.
Итак рассмотрим применение функции exec().
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> exec('m = 9')
>>> m
9
Пример 2.
>>> var = 'm'
>>> var = 'm = 9'
>>> exec(var)
>>> m
9
 
Пример 3.
for i in range(5):
    exec('val'+str(i)+'='+str(i))
    exec('print(val'+ str(i)+')')
Но использование такого метода как в Примере 3 достаточно трудоемко.
Так же можно использовать способ моделирования динамической переменной. Когда создается словарь, в котором ключ соответствует имени переменной, а значение соответствует значению переменной.
конец моего прим.)
Теперь попробуйте Вы и попробую я динамически создать атрибут к объекту, который определен заранее и Вы в ходе программы динамически получаете имя атрибута в виде строки.
1
1 / 1 / 0
Регистрация: 04.03.2019
Сообщений: 70
04.10.2020, 10:53  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Теперь попробуйте Вы и попробую я динамически создать атрибут к объекту, который определен заранее и Вы в ходе программы динамически получаете имя атрибута в виде строки.
я не понял, мне надо обращение к классу, например
class.one.two(params=14332, fs=32e)

и в классе допустим будет запрос к сайту ( без разницы что )
exampl.com/one/two?params=12312&fs=4234
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
04.10.2020, 11:43
Динамические атрибуты - скользкая дорожка, польза от них сомнительна.
Это хорошо, когда кроме __getattr__ вы ещё переопределяете __dir__, причём чтобы он сумел сработать в нужное время. Либо задействовать интерфейс. В общем, сложно тут всё, лучше сделайте через class['one']['two'], куда меньше гемора будет.
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.10.2020, 12:11
Цитата Сообщение от _shut_ Посмотреть сообщение
не могу понять что и как там
Ты документацию по __getattr__ прочитай. Там все элементарно - перехватываем вызов несуществующего атрибута, вызываем базовый метод. Или еще что, в зависимости от наших хотелок. Все. А смотреть vk бесполезно, тем более, если ты не понимаешь ООП в Python.

P.S. И да, пока ты вообще не понимаешь зачем нужны такие атрибуты и где они применимы.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
04.10.2020, 12:54
_shut_, Кстати Garry Galler, правильно говорит, есть возможности перехватывать не существующие атрибуты, и вставлять свои. Но я уже подзабыл, как это работает, то ли действительно создается новый атрибут, толи его имитация. Почитайте документацию.
Но с помощью функции exec все получилось, тоже все работает. Вот тестирующий пример.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A:
    def __init__(self, name):
        self.name = name
 
 
class B:
    def __init__(self, name):
        self.name = name
 
x = A('clsA')
y = B('clsB')
 
print(x.name)
print(y.name)
atr1 = 'y.one = x'
exec(atr1)
print(y.one)
atr2 = 'y.one.two = 2'
exec(atr2)
print(y.one.two)
 
# print в данном коде не обязателен, он используется только для проверки работы кода.
Но нужно не забывать одну тонкость, все будет работать только в том случае, если значением первого атрибута будет объект, для которого можно создавать новые атрибуты (например экземпляр пользовательского класса, как здесь в примере).
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.10.2020, 13:05
Вот самая элементарная реализация динамики в атрибутах:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> class Test():    
    
    def dummy(self,attr,*args,**kwargs):
        '''метод, который будет имитировать все прочие методы'''
        level = attr.upper()
        print(level,*args,**kwargs)
    
    def __getattr__(self,attr):
        def wrap(*args,**kwargs):
            return self.dummy(attr,*args,**kwargs)    
        return wrap
 
>>> test = Test()
>>> test.debug(1,2,3)
DEBUG 1 2 3
>>> test.что_угодно(1,2,3)
ЧТО_УГОДНО 1 2 3
>>>
Несуществующий атрибут также можно сделать существующим при помощи setattr.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
04.10.2020, 15:52
_shut_, То о чем говорит Garry Galler, описывается в книге
Лутц М. Изучаем Python (том 2, 5-е издание, 2019) Глава 38 "Управляемые атрибуты".

Добавлено через 18 минут
_shut_, Кстати я и забыл, для атрибутов пользовательских классов создание нового атрибута за пределами класса осуществляется действительно, как сказал Garry Galler, с помощью функции setattr.
Python
1
2
3
4
5
6
7
setattr(obj, name, value)
 
obj : object Объект, который следует дополнить атрибутом.
 
name : str Строка с именем атрибута. Можно указывать как имя нового, так и существующего атрибута.
 
value : Произвольное значение атрибута.
А так как атрибут для атрибута можно создавать только для пользовательских классов (для встроенных классов это не работает). то использование функции setattr() является оптимальным вариантом.
Использование же функции exec() оптимально использовать для динамического создания простых переменных (не атрибутов), где не используются пользовательские классы и потому не применима функция setattr().
1
1 / 1 / 0
Регистрация: 04.03.2019
Сообщений: 70
04.10.2020, 17:05  [ТС]
сделал так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Senler:
    params = {
        'access_token': None,
        'v': 2,
        'vk_group_id': None
    }
 
    def __init__(self, token, vk_group_id):
        self.params['access_token'] = token
        self.params['vk_group_id'] = vk_group_id
 
    def __call__(self, globalmethod, method, **kwargs):
        self.params.update(kwargs)
        r = requests.post('http://senler.ru/api/%s/%s' % (globalmethod, method), data=self.params)
        return r.json()
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
05.10.2020, 09:35
_shut_, не обижайтесь, но плохо. Это показывает, что с ООП вообще и с питоном в частности у вас не айс. Рановато вам в динамические атрибуты.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.10.2020, 09:35
Помогаю со студенческими работами здесь

Создать класс, для работы с динамическими векторами
Создать класс, для работы с динамическими векторами, длины n. В класс реализовать операцию вычитания векторов ввода и вывода в поток....

Создать класс, для работы с динамическими векторами
Создать класс, для работы с динамическими векторами, длины n. В классе реализовать операцию вычитания векторов ввода и вывода данных в...

Создать динамический класс для выполнения операций с динамическими массивами чисел
Создать динамический класс для выполнения операций с динамическими массивами чисел. Сделать перегрузки символов операций: "=" -...

Создать динамичный класс для операций с динамическими массивами чисел действительного типа
Создать динамичный класс для операций с динамическими массивами чисел действительного типа. Сделать перегрузки символов операций: ...

Создать класс для выполнения операций с динамическими массивами чисел действительного типа
Создайте класс для выполнения операций с динамическими массивами чисел действительного типа. Сделать перегрузку операций: -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru