Как правильно оформить Класс?

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
Указать свою операционную системуWINDOWS 10 x 64
Указать версию Python3.8.0
Укажите версию библиотек с которыми работаете
Код:
Package                          Version
-------------------------------- ---------
aiogram                          2.11.2
aiohttp                          3.6.3
altgraph                         0.17
async-timeout                    3.0.1
atomicwrites                     1.4.0
attrs                            20.3.0
Babel                            2.9.0
beautifulsoup4                   4.9.3
bindglobal                       0.0.3
cattrs                           1.1.2
certifi                          2020.12.5
chardet                          3.0.4
click                            7.1.2
colorama                         0.4.4
configparser                     5.0.1
cycler                           0.10.0
decorator                        4.4.2
discord                          1.0.1
discord.py                       1.5.1
facebook-sdk                     3.1.0
filetype                         1.0.5
Flask                            1.1.2
future                           0.18.2
huepy                            1.2.1
idna                             2.10
imageio                          2.9.0
imageio-ffmpeg                   0.4.2
imutils                          0.5.3
iniconfig                        1.1.1
instabot                         0.117.0
instagram-private-api            1.6.0.0
instagram-private-api-extensions 0.3.9
instapy-cli                      0.0.12
itsdangerous                     1.1.0
Jinja2                           2.11.2
keybind                          0.3.0
kiwisolver                       1.3.1
MarkupSafe                       1.1.1
matplotlib                       3.3.3
mock                             4.0.2
MouseInfo                        0.1.3
moviepy                          1.0.1
multidict                        4.7.6
numpy                            1.19.4
oauthlib                         3.1.0
opencv-python                    4.4.0.46
packaging                        20.7
pefile                           2019.4.18
Pillow                           8.0.1
pip                              20.3.1
playsound                        1.2.2
pluggy                           0.13.1
proglog                          0.1.9
py                               1.9.0
PyAutoGUI                        0.9.52
PyGetWindow                      0.0.9
pyinstaller                      4.1
pyinstaller-hooks-contrib        2020.10
PyMsgBox                         1.0.9
pynput                           1.6.8
pyparsing                        2.4.7
pyperclip                        1.8.1
pypref                           3.1.0
PyQt5                            5.15.2
PyQt5-sip                        12.8.1
PyQt5-stubs                      5.14.2.2
PyRect                          0.1.4
PyScreeze                        0.1.26
PySocks                          1.7.1
pyTelegramBotAPI                 3.7.4
pytest                           6.1.2
python-dateutil                  2.8.1
python-facebook-api              0.7.2
python-xlib                      0.29
PyTweening                       1.0.3
pytz                             2020.4
pywin32-ctypes                   0.2.0
requests                         2.25.0
requests-oauthlib                1.3.0
requests-toolbelt                0.9.1
responses                        0.11.0
schedule                         0.6.0
scipy                            1.5.4
setuptools                       50.3.2
six                              1.15.0
soupsieve                        2.0.1
toml                             0.10.2
tqdm                             4.54.1
typing-extensions                3.7.4.3
urllib3                          1.26.2
vk                               2.0.2
vk-api                           11.9.1
Werkzeug                         1.0.1
yarl                             1.5.1
Вставьте фрагмент кода который у вас имеется на данный моментОписание вопроса ниже

Пытаюсь тренироваться и писать в ООП, но немного не понял, что творится с переменными класса.

Вот сам код класса:
Python:
# !/usr/bin/python3
# -*- coding: utf-8 -*-

import os


class CFPP(object):

    def __init__(self, path_string):
        """
        Инициализация класса
        :param path_string: Путь до файла
        :type path_string: str
        :return: Массив с данными
        :rtype: dict
        """
        self.ps = path_string

        self.arr = ps.split('/')
        self.pathFile = os.path.basename(self.ps)
        fullname = arr[:-1:]
        ext_arr = str(fullname).split('.')
        filename = ext_arr[0]
        ext = ext_arr[1]

        cleanData = {
            'path_string': self.ps,
            'pathFile': pathFile,
            'fullName': fullname,
            'fileName': filename,
            'fileExt': ext,
        }

    @property
    def pathFile(self):
        return self.path_file

    @property
    def simpleData(self):
        return self.arr

    @property
    def fullname(self):
        return self.fullname

    @property
    def filename(self):
        return self.filename

    @property
    def fileExt(self):
        return self.ext

    @property
    def cleanData(self):
        return self.cleanData

Использование:
Python:
ParsePath = CFPP(filepath)

Его смысл - получает строку пути до файла и разбирает ее по частям. Хочу добиться, чтобы в ParsePath был dict с данными cleanData. Сейчас он жалуется, что переменную "self.pathFile" невозможно установить:
1607631343008.png

А при запуске жалуется, что невозможно установить переменную:
Traceback (most recent call last):
File "D:/DOCUMENTS/ПРОГРАММИРОВАНИЕ/PYTHON/PROJECTS/PYCHARM/test/1.0.0.0/test01.py", line 22, in <module>
ParsePath = CFPP(captcha_path)
File "D:\DOCUMENTS\ПРОГРАММИРОВАНИЕ\PYTHON\PROJECTS\PYCHARM\test\1.0.0.0\CoolFilePathParser.py", line 20, in __init__
self.pathFile = os.path.basename(self.ps)
AttributeError: can't set attribute

Process finished with exit code 1

Почему невозможно, если я присваиваю ей значение? Или __init__ служит только для присваивания переменных? Если это так, то тогда несколько вопросов:
1 - Как добиться того, что в cleanData будет уже готовый массив?
2 - Каким образом можно было бы отдельно получить каждый параметр из cleanData (воплощено через @property)?
3 - Как сделать, чтобы ParsePath сразу получал данные cleanData при инициализации CFPP(captcha_path)?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Возможно ли сделать так, чтобы ParsePath сразу получал cleanData без вызова дополнительных методов?
Не правильно понял вопрос - думал вам нужно получить строку через print(ParsePath).
Если вам нужно чтобы экземпляр класса возвращал словарь, то нужно использовать дополнительные методы
или наследоваться от встроенного класса dict:
Python:
class CFPP(dict):

    def __init__(self, path_string):
        """
        Инициализация класса
        :param path_string: Путь до файла
        :type path_string: str
        :return: Массив с данными
        :rtype: dict
        """
        self.ps = path_string
        self.arr = str(self.ps).split('/')
        self.pathFile = os.path.dirname(self.ps)
        self.fullname = self.arr[-1]
        self.ext_arr = str(self.fullname).split('.')
        self.filename = self.ext_arr[0]
        self.ext = self.ext_arr[1]

        self.cleanData = {
            'path_string': self.ps,
            'pathFile': self.pathFile,
            'fullName': self.fullname,
            'fileName': self.filename,
            'fileExt': self.ext,
        }
        super().__init__(self.cleanData)

    @property
    def get_pathFile(self):
        return self.path_file

    @property
    def get_simpleData(self):
        return self.arr

    @property
    def get_fullname(self):
        return self.fullname

    @property
    def get_filename(self):
        return self.filename

    @property
    def get_fileExt(self):
        return self.ext

    @property
    def get_cleanData(self):
        return self.cleanData


ParsePath = CFPP(file_path)
print(ParsePath)
print(type(ParsePath))
print(isinstance(ParsePath, dict))
print(ParsePath['fileName'])
 
  • Мне нравится
Реакции: VolodinAS

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Просто, хотел, чтобы всё было в одной строке, типа
Добавьте в класс метод __str__
Python:
def __str__(self):
    return json.dumps(self.cleanData, indent=4)
и сможете делать:
Python:
ParsePath = CFPP(file_path)
print(ParsePath)
 
  • Мне нравится
Реакции: VolodinAS

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Но я же уже ответил... Там ошибку выдает...
Добавьте метод в класс унаследованный от dict и не будет ошибки.
 
  • Мне нравится
Реакции: VolodinAS

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
Так, вроде бы с ошибкой разобрался:
Python:
# !/usr/bin/python3
# -*- coding: utf-8 -*-

import os


class CFPP(object):

    def __init__(self, path_string):
        """
        Инициализация класса
        :param path_string: Путь до файла
        :type path_string: str
        :return: Массив с данными
        :rtype: dict
        """
        self.ps = path_string
        print('self.ps:', self.ps)
        self.arr = str(self.ps).split('/')
        print('self.arr:', self.arr)
        self.pathFile = os.path.dirname(self.ps)
        print('self.pathFile:', self.pathFile)
        self.fullname = self.arr[-1]
        print('self.fullname:', self.fullname)
        self.ext_arr = str(self.fullname).split('.')
        print('self.ext_arr:', self.ext_arr)
        self.filename = self.ext_arr[0]
        print('self.filename:', self.filename)
        self.ext = self.ext_arr[1]
        print('self.ext:', self.ext)

        self.cleanData = {
            'path_string': self.ps,
            'pathFile': self.pathFile,
            'fullName': self.fullname,
            'fileName': self.filename,
            'fileExt': self.ext,
        }

    @property
    def get_pathFile(self):
        return self.path_file

    @property
    def get_simpleData(self):
        return self.arr

    @property
    def get_fullname(self):
        return self.fullname

    @property
    def get_filename(self):
        return self.filename

    @property
    def get_fileExt(self):
        return self.ext

    @property
    def get_cleanData(self):
        return self.cleanData

Но чтобы получить готовые данные, приходится получать нужный мне словарь cleanData через вызов property класса cleanData:
Python:
ParsePath = CFPP(file_path)
print('ParsePath: ', json.dumps(ParsePath.get_cleanData, indent=4) )
ParsePath: {
"path_string": "mydoc/data/keys/import.jpg",
"pathFile": "mydoc/data/keys",
"fullName": "import.jpg",
"fileName": "import",
"fileExt": "jpg"
}

Возможно ли сделать так, чтобы ParsePath сразу получал cleanData без вызова дополнительных методов?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Возможно ли сделать так, чтобы ParsePath сразу получал cleanData без вызова дополнительных методов?
Можно например переопределить метод __str__ в классе CFPP:
Python:
def __str__(self):
    return json.dumps(self.cleanData, indent=4)
 

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
Можно например переопределить метод __str__ в классе CFPP:
Python:
def __str__(self):
    return json.dumps(self.cleanData, indent=4)

Тогда при выполнении:
Python:
ParsePath = CFPP(captcha_path)
print(ParsePath)
print( type(ParsePath) )
print( ParsePath['fileName'] )

Выдаст ошибку:
{
"path_string": "mydoc/data/keys/import.jpg ",
"pathFile": "mydoc/data/keys",
"fullName": "import.jpg",
"fileName": "import",
"fileExt": "jpg"
}
<class 'CoolFilePathParser.CFPP'>
Traceback (most recent call last):
File "D:/DOCUMENTS/ПРОГРАММИРОВАНИЕ/PYTHON/PROJECTS/PYCHARM/test /1.0.0.0/test01.py", line 29, in <module>
print( ParsePath['fileName'] )
TypeError: 'CFPP' object is not subscriptable

Process finished with exit code 1
 

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
Python:
ParsePath = CFPP(file_path)
print(ParsePath)
print(type(ParsePath))
print(isinstance(ParsePath, dict))
print(ParsePath['fileName'])
Получается, что только через 2 строки кода можно получить желаемый результат...
Просто, хотел, чтобы всё было в одной строке, типа
Python:
ParsePath = CFPP(file_path)
print(ParsePath)
и уже выводится результат... Ясно, ладно, спасибо за помощь!
 

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
Добавьте в класс метод __str__
Python:
def __str__(self):
    return json.dumps(self.cleanData, indent=4)
и сможете делать:
Python:
ParsePath = CFPP(file_path)
print(ParsePath)
Но я же уже ответил... Там ошибку выдает...
 

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
Добавьте метод в класс унаследованный от dict и не будет ошибки.
Спасибо!
 

Форум IT Специалистов