Классы в python

Статус
В этой теме нельзя размещать новые ответы.

Korshun

Новорег
Статус
Offline
Регистрация
22 Окт 2021
Сообщения
3
Лайки
0
У меня вопрос немного такого характера. Мне нужно создать определённую команду по "кубикам". Для этого у меня есть идея создавать class в class. Тоесть в одном class одна часть команды, а во второй вторая часть и так далее, при чем иногда начало может быть одинаковым у команды. Такое вообще возможно реализовать?
 
Да, создать класс внутри класса вполне возможно, и эта концепция называется "вложенные классы" (nested classes). Вложенные классы могут быть полезны, когда у вас есть логически связанная группа классов, которую вы хотите объединить для улучшения читаемости и структурированности кода.

Вот пример того, как можно использовать вложенные классы в Python:

Python:
class Кубики:
    def __init__(self, имя):
        self.имя = имя

    class Команда1:
        def __init__(self, параметр1):
            self.параметр1 = параметр1

        def выполнить(self):
            print(f'{self.параметр1} из Команда1 выполнена для {self}.')

    class Команда2:
        def __init__(self, параметр2):
            self.параметр2 = параметр2

        def выполнить(self):
            print(f'{self.параметр2} из Команда2 выполнена для {self}.')

# Пример использования
команда1 = Кубики.Команда1('Действие 1')
команда2 = Кубики.Команда2('Действие 2')

команда1.выполнить()
команда2.выполнить()

В этом примере у нас есть внешний класс Кубики и два вложенных класса Команда1 и Команда2. Каждый из вложенных классов имеет собственные методы и свойства. Это удобно, когда у вас есть много команд, связанных с основной функциональностью и вы хотите их логически организовать.

Имейте в виду, что вложенные классы не имеют специального доступа к частным членам внешнего класса (если они не передаются явно), поэтому взаимодействие между ними и внешним классом вам нужно продумать заранее.

Если вам необходимо, чтобы начало команды было одинаковым для нескольких команд, вы могли бы также рассмотреть использование наследования классов или общих методов.
 
А если мне эти команды нужно ещё отправлять с помощью специальных команд, взятых их из другой библиотеки (к примеру в ней есть методы read и write, для запроса и отправки команды). Тогда как лучше эту библиотеку подключить?
 
Да, создать класс внутри класса вполне возможно, и эта концепция называется "вложенные классы" (nested classes). Вложенные классы могут быть полезны, когда у вас есть логически связанная группа классов, которую вы хотите объединить для улучшения читаемости и структурированности кода.

Вот пример того, как можно использовать вложенные классы в Python:

Python:
class Кубики:
def __init__(self, имя):
self.имя = имя

class Команда1:
def __init__(self, параметр1):
self.параметр1 = параметр1

def выполнить(self):
print(f'{self.параметр1} из Команда1 выполнена для {self}.')

class Команда2:
def __init__(self, параметр2):
self.параметр2 = параметр2

def выполнить(self):
print(f'{self.параметр2} из Команда2 выполнена для {self}.')

# Пример использования
команда1 = Кубики.Команда1('Действие 1')
команда2 = Кубики.Команда2('Действие 2')

команда1.выполнить()
команда2.выполнить()
В этом примере у нас есть внешний класс Кубики и два вложенных класса Команда1 и Команда2. Каждый из вложенных классов имеет собственные методы и свойства. Это удобно, когда у вас есть много команд, связанных с основной функциональностью и вы хотите их логически организовать.

Имейте в виду, что вложенные классы не имеют специального доступа к частным членам внешнего класса (если они не передаются явно), поэтому взаимодействие между ними и внешним классом вам нужно продумать заранее.

Если вам необходимо, чтобы начало команды было одинаковым для нескольких команд, вы могли бы также рассмотреть использование наследования классов или общих методов.
А если мне эти команды нужно ещё отправлять с помощью специальных команд, взятых их из другой библиотеки (к примеру в ней есть методы read и write, для запроса и отправки команды). Тогда как лучше эту библиотеку подключить?
 
А если мне эти команды нужно ещё отправлять с помощью специальных команд, взятых их из другой библиотеки (к примеру в ней есть методы read и write, для запроса и отправки команды). Тогда как лучше эту библиотеку подключить?
Если у вас есть внешняя библиотека с методами, такими как read и write, которые вы хотите использовать для отправки и получения команд, вы можете подключить эту библиотеку в ваш проект и использовать её внутри ваших вложенных классов. По сути, вы просто импортируете нужные функции или классы из этой библиотеки и используете их.

Ниже приведен пример того, как это можно сделать:

Предположим, у вас есть библиотека communication_lib с классом Communicator, который имеет методы read и write.

1. Импортируйте нужные классы или методы из библиотеки.
2. Используйте их в вашем коде.

Python:
# Импортируем класс Communicator из внешней библиотеки
from communication_lib import Communicator

class Кубики:
    def __init__(self, имя):
        self.имя = имя
        self.communicator = Communicator()  # Создаем экземпляр класса Communicator

    class Команда1:
        def __init__(self, параметр1, communicator):
            self.параметр1 = параметр1
            self.communicator = communicator

        def выполнить(self):
            # Используем метод write из Communicator для отправки команды
            self.communicator.write(f'Отправка {self.параметр1} из Команда1')
            # Возможное чтение ответа
            ответ = self.communicator.read()
            print(f'Ответ: {ответ}')

    class Команда2:
        def __init__(self, параметр2, communicator):
            self.параметр2 = параметр2
            self.communicator = communicator

        def выполнить(self):
            # Используем метод write из Communicator для отправки команды
            self.communicator.write(f'Отправка {self.параметр2} из Команда2')
            # Возможное чтение ответа
            ответ = self.communicator.read()
            print(f'Ответ: {ответ}')

# Пример использования
кубики = Кубики('Пример')
команда1 = кубики.Команда1('Действие 1', кубики.communicator)
команда2 = кубики.Команда2('Действие 2', кубики.communicator)

команда1.выполнить()
команда2.выполнить()

В этом примере внешний класс Кубики создаёт экземпляр Communicator, который затем передаётся в конструкторы вложенных классов Команда1 и Команда2. Это позволяет каждому из вложенных классов использовать методы read и write для выполнения своих действий.

Такой подход позволяет вам полностью инкапсулировать логику отправки и получения сообщений в каком-либо объекте (в данном случае — в Communicator), что делает вашу архитектуру более гибкой и удобной для дальнейшего тестирования и расширения.
 
Да, вполне возможно — и не только через вложенные классы, но и через композицию или шаблон «Строитель» (Builder). Например через вложенных классов:

class Command:
class PartA:
def init(self, value):
self.value = value
def str(self):
return f"PartA({self.value})"

class PartB:
def init(self, flag):
self.flag = flag
def str(self):
return f"PartB({self.flag})"
............
Здесь Command.PartA и Command.PartB определены внутри Command, но их можно использовать и снаружи (как Command.PartA(...)).
 
Да, возможно реализовать. Я не совсем эксперт Python, да и программирования в целом, сам только в процессе изучения, но языки программирования часто оставляют много возможностей, в том числе, и такое, что только больному юзеру не придет в голову
 
class Command:
def init(self, base_command):
self._parts = [base_command]

class SubCommand:
def init(self, parent, part):
self._parent = parent
self._parent._parts.append(part)

def parameter(self, value):
self._parent._parts.append(str(value))
return self._parent

def sub_command(self, part):
return self.SubCommand(self, part)
 
Да, ты спокойно можешь разбивать команды на части с помощью вложенных классов или связанных между собой классов. Главное — чётко понимать логику и структуру вложения, чтобы потом не запутаться.
 
Да, возможно. Используйте вложенные классы или композицию.


class Command {
static PartOne = class {
execute() { return "Часть 1"; }
};
static PartTwo = class {
execute() { return "Часть 2"; }
};
parts = [];
addPart(part) { this.parts.push(part); }
run() { return this.parts.map(p => p.execute()).join(' -> '); }
}

const cmd = new Command();
cmd.addPart(new Command.PartOne());
cmd.addPart(new Command.PartTwo());
console.log(cmd.run()); // Часть 1 -> Часть 2


Это позволяет модульно собирать команды, включая одинаковые начала.
 
Статус
В этой теме нельзя размещать новые ответы.

ВопросНачало пути прогера

Назад
Сверху