Задать вопрос
@Span4ev

Как получить кол-во атрибутов класса и передать атрибуты в словарь?

Сразу прошу прощения за наглость. Я не прошу написать код, лишь ответить "ДА/НЕТ" на вопросы "возможно ли?"
и "если возможно, то насколько это сложно?"

В общем, я сторонник сокращения кол-ва кода, думаю, как и вы, но данная идея завела меня в тупик.
По классике, все челы в Renpy просто пишут кучу одинаковых строк кода (это ужасно), вместо того, чтобы использовать простые функции или циклы. Тысячи одинаковых строк кода (без преувеличения). Вместо классов они используют сотни переменных для каждого персонажа. Поэтому у ренпаевцев даже нет смысла спрашивать об этом.

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

# Пока что на примере словаря
my_dict = {
    'name': '9993993',
    '123asd' : 20,
    'ssdf': 'blond',
    'sdfasdfsdf': 666,
    ...
}

#Создаю инфо панель на основе цикла

vpgrid: # Это сетка. Что-то типа как CSS Grid

    cols 2
    rows len(my_dict) # кол-во строк от длины словаря

    for i, k in my_dict.items(): # Пока что на примере словаря
        frame:
            text str(i)
        frame:
            text str(k)


Классический подход: для 20 персонажей сделать 20 разных окон, в каждом из которых прописать 100 переменных для каждого 20...

Цикл работает. Я получаю таблицу (2 столбца, 4 строки). В левом столбце я получаю название ключа, а в правом - его значение.
Отлично. Но можно лучше:

class Person(...)
    self.name = name
    self.age = age
Anna = Person(...)

frame:
    text str(Anna.name) # Сюда можно передавать значение атрибутов класса.


И здесь у меня опускаются руки, потому что кажется, что слишком до хрена хочу...
1. Можно ли получить кол-во атрибутов класса? Это нужно чтобы на основе этого числа создать нужное кол-во строк для сетки, как в "rows len(dics)".
2. Можно ли передать эти атрибуты в словарь? Здесь придётся или создавать несколько словарей для каждого чела, или использовать 1 и переписывать его в зависимости от того, хар-ки какого персонажа отображаются в инфо панели.

Чтобы вместо имён атрибутов, типа "Anna.name" использовать собственное название "Name" я мог бы использовать strip() и title() (или типа того) и выводить Name и Age, вместо anna.name и anna.age.

3. И самое важное и наглое - возможно ли это синхронизировать, чтобы когда цикл перебирал ключи, я использовал "Имя" вместо "Name", "Возраст" вместо "Age". Я не знаю, это нужно в методах класса будет прописывать условия и как-то это возвращать? Я просто не знаю, так бы вы сделали.
Вот здесь я думаю песенка спета. Потому что это ещё не всё. Т.к. словарь хранит данные в неупорядоченном виде, можно ли задавать приоритеты для вывода в таблицу, например, чтобы name было первым, age - вторым и т.д.?

Возможно тут можно вообще обойтись без словаря, но моя фантазия так не умеет.

Короче, пайтон - великий и могучий, но если это всё сложно или невозможно и того не стоит, то я, пожалуй, просто откажусь от этой затеи.
Можно просто прописать все значения без цикла вручную, как неандерталец с дубиной. Будет просто, интуитивно. Миллион строк кода - ну и что ж...

Я спрашиваю про возможности, потому что в последнее время я привык к тому, что одно невозможно, другое не реализовано.
Пример:
1. есть свойство minwidth, но нет maxwidth
2. Нельзя добавить border к textbutton, но можно к frame
3. Нельзя убрать автоматическое заполнение ширины у дочерних элементов в сетке, как xfill = False.
и т.д. Поэтому сначала хочу понять, позволяет ли вообще пайтон производить такие манипуляции и если да, то насколько хорошо его нужно знать, чтобы реализовать это?

Спасибо, что дочитали. Извините за наглость.
  • Вопрос задан
  • 135 просмотров
Подписаться 2 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@serhiops
Python/JavaScript/C++
Судя по вопросу, ты вообще не понимаешь как работать с ООП в питоне. Атрибуты класса ты можeшь получить так:
Person.__dict__
Добавить:
setattr(Person, 'name', 'value')
Удалить:
delattr(Person, 'name',)
Чтобы можно было делать так:
p = Person(*attr)
len(p)

Нужно определить метод __len__ в этом классе:
class Person:
    .......
    def __len__(self):
        return x

Этот метод будет срабатывать когда ты будешь указывать обьект класса как атрибут функции len
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Не знаю как устроен Renpy но доменная модель совершенно не продуманная. Можно создать базовый тип для "персонажа". Имя там... возраст. И производные от него указать.

Мы-же в парадигме ООП работаем, верно?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы