Введение

С возвращением, отважные читатели, в очередной выпуск серии Python - C ++. На нашей последней встрече мы обсудили важность и использование функции в Python и C ++. Сегодня мы расширим эту идею, углубившись в мир классов. Мы рассмотрим некоторые базовые варианты использования классов, а затем создадим наши собственные примеры, собрав класс на каждом языке, который можно использовать для разработки персонажа RPG.

Классы

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

В Python класс создается, сначала определяя наш класс, а затем имя, которое мы хотим, чтобы класс был; В соглашениях об именах каждое слово пишется с заглавной буквы без пробелов между словами:

class ClassName():

Каждый создаваемый нами класс должен начинаться с функции инициализации. Эта функция инициализирует значения любых важных данных при вызове и создании нового объекта или класса. Эта функция будет включать любые переменные, которые мы хотим передать через весь класс. Она определяется как любая другая функция, которую мы создаем, но должна иметь имя __init__, чтобы компьютер мог распознать, что это инициализирующая функция. В круглых скобках должен быть включен атрибут self, это позволяет распознавать переменные и данные класса во всем классе. В теле функции __init__ мы включаем переменные класса, которые мы хотим пронести повсюду; эти переменные должны быть созданы с использованием self. метод, как показано ниже:

def __init__(self, att2, att3, att4):
    self.att2 = att2
    self.att3 = att3
    self.att4 = att4

Остальная часть класса состоит из любых функций, которые необходимо включить; снова self необходимо передать как атрибут для каждой функции, чтобы позволить распознавание свойств класса. Внутри этих функций переменные класса или свойства объекта могут быть вызваны снова, используя self. метод:

def func2(self):
    print(self.att2)
    return self.att3 + self.att4

Значения в свойствах класса также можно изменить, вызвав свойство с помощью self. метод и установив его равным новому интересующему значению:

def func3(self):
    if self.att2 > self.att3:
        self.att4 = self.att2
    else:
        self.att4 = self.att3

В C ++ класс или объект создается аналогичным образом путем определения объекта как класса с последующим присвоением ему имени; тогда тело класса нужно заключить в фигурные скобки:

class ClassName
{
    <class body>
};

«Инициализирующая функция» в классе C ++ обозначается установкой для этого класса значения public, private или protected. Это спецификаторы доступа, которые сообщают компьютеру, можно ли получить доступ к атрибутам и методам (функциям класса) за пределами класса. Public разрешает доступ вне класса; private не разрешает доступ вне класса; protected разрешает доступ за пределами класса только в экземплярах наследования, которые мы обсудим немного позже. Мы можем указать множественные спецификаторы доступа, если есть некоторые части класса, которые мы хотим сохранить частными, а остальные - общедоступными. Тело этого спецификатора доступа будет включать атрибуты и методы класса, которые настраиваются как любая другая переменная или функция; обратите внимание, что, в отличие от python, при установке атрибутов класса внутри метода мы все равно должны возвращать атрибут, тогда как в python нам не нужно указывать этот возврат:

public:
    std::string att1;
    std::string att2;
    int att3;
    double att4;
    bool att5;
    std::string setAtt1()
    {
        std::cout << “What is att1?”;
        std::cin >> att1;
        return att1;
    };
    std::string setAtt2()
    {
        std::cout << “What is att2?”;
        std::cin >> att2;
        return att2;
    };
    int att3PlusAtt4()
    {
        att3 = 5;
        att4 = 10.6;
        return att3 + att4;
    };
    bool setAtt5()
    {
        if (att3PlusAtt4() > 5)
        {
            att5 = true;
        }
        else
        {
            att5 = false;
        }
    };
private:
    std::string att6 = “CLASSIFIED”;
    int att7 = 42;

Вызов и использование класса

В Python класс можно вызвать, просто создав экземпляр новой переменной для вызова объекта:

myClass = ClassName(“hello readers”, 1, 2)

Чтобы получить доступ к атрибутам и методам в этом новом объекте, мы используем точечный метод:

var = myClass.func2()
myClass.func3()
var2 = myClass.att4
print(var2) # will print out a boolean value

В C ++ класс вызывается примерно так же. Сначала выполняется вызов класса, за которым следует имя нашего нового объекта.

int main()
{
    ClassName newClass;
}

Как и в Python, атрибуты и методы класса C ++ вызываются с помощью точечного метода:

newClass.setAtt1();
newClass.setAtt2();
newClass.setAtt4();
newClass.setAtt5();
std::cout << newClass.att1 << std::endl;
std::cout << newClass.att2 << std::endl;
std::cout << newClass.att4 << std::endl;
std::cout << newClass.att5 << std::endl;

Наследование класса

Могут быть случаи, когда мы хотим создать несколько классов, но каждый из этих классов имеет несколько общих атрибутов. В этом случае мы можем создать класс, который наследует эти атрибуты от некоторого родительского класса. Например, мы можем создать родительский класс:

class Parent():
    def __init__(self, att1, att2):
        self.att1 = att1
        self.att2 = att2
    def print_att_1(self):
        print(att1)
    def print_att_2(self):
        print(att2)

Затем мы можем использовать атрибуты родительского класса в новом дочернем классе, создав новый класс и используя родительский класс в качестве атрибута; функция init будет включать все атрибуты, перенесенные из родительского класса, а также любые новые атрибуты, которые мы хотим включить в дочерний класс. Наконец, в теле класса init мы должны включить метод super (), который позволяет нам копировать атрибуты из родительского класса:

class Child(Parent):
    def __init__(self, att1, att2, att3, att4):
        super().__init__(att1, att2)
        self.att3 = att3
        self.att4 = att4
        def print_att_3(self):
            print(att3)
        def print_att_4(self):
            print(att4)

В C ++ мы можем создать родительский класс следующим образом:

class Parent
{
    public:
    int att1;
}

Когда мы создаем дочерний класс, мы указываем наследование от родительского класса, определяя дочерний класс и имя, используя двоеточие в качестве разделителя, затем указывая режим доступа родителя и имя родительского класса; это дает дочернему классу доступ ко всему в рамках публичного или частного режима доступа родителя. Отсюда мы просто создаем тело класса, как обычно, включая дочерний режим доступа и любые атрибуты и методы, которые мы хотим включить:

class Child : public Parent
{
    public:
    int att2;
}

Вызов и доступ к атрибутам и методам дочернего класса такие же, как если бы мы вызывали любой другой класс.

Пример класса персонажа

Ниже приведен класс, закодированный на Python, который создает персонажа RPG, включая имя, расу, специальность, очки жизни и очки магии.

Python:

class Character():
    """ A class that holds character information """
    def __init__(self, name="", race="", specialty="", hp=0, mp=0):
        self.name = name
        self.race = race
        self.specialty = specialty
        self.hp = hp
        self.mp = mp
    def set_name(self):
        """ Sets character name """
        print("What is your name?")
        self.name = input()
    def set_race(self):
        """ Sets character race """
        print("What is your race? Choose between human, elf, or  
              dwarf.")
        self.race = input()
    def set_specialty(self):
        """ Sets character class/specialty """
        print("What is your specialty (or class)? Choose between    
              warrior, mage, or rogue.")
        self.specialty = input()
    def set_hp(self):
        if self.specialty == "Warrior":
            self.hp = 25
        elif self.specialty == "Mage":
            self.hp = 15
        elif self.specialty == "Rogue":
            self.hp = 20
        print(f"You have {self.hp} hit points.")
    def set_mp(self):
        if self.specialty == "Warrior":
            self.mp = 5
        elif self.specialty == "Mage":
            self.mp = 15
        elif self.specialty == "Rogue":
            self.mp = 10
            print(f"You have {self.mp} magic points.")
    def view_character_stats(self):
        print(f"Name: {self.name}")
        print(f"Race: {self.race}")
        print(f"Class: {self.specialty}")
        print(f"HP: {self.hp}")
        print(f"MP: {self.mp}")
newChar = Character()
newChar.set_name()
newChar.set_race()
newChar.set_specialty()
newChar.set_hp()
newChar.set_mp()
newChar.view_character_stats()

возвращает:

$ python3 classes.py
>> What is your name?
>> Daniel
>> What is your race? Choose between human, elf, or dwarf.
>> Human
>> What is your specialty (or class)? Choose between warrior, mage,  
   or rogue.
>> Warrior
>> You have 25 hit points.
>> You have 5 magic points.
>> Name: Daniel
>> Race: Human
>> Class: Warrior
>> HP: 25
>> MP: 5

C++:

#include <iostream>
#include <string>
class Character
{
    public:
        std::string name;
        std::string race;
        std::string specialty;
        int hp;
        int mp;
        std::string setName()
        {
            std::cout << "What is your name?\n";
            std::cin >> name;
            return name;
        };
        std::string setRace()
        {
            std::cout << "What is your race? Choose between human, 
                          elf, or dwarf.\n";
            std::cin >> race;
            return race;
        };
        std::string setSpecialty()
        {
            std::cout << "What is your specialty (or class)? Choose  
                          between warrior, mage, or rogue.\n";
            std::cin >> specialty;
            return specialty;
        };
        int setHP()
        {
            if (specialty == "Warrior")
            {
                hp = 25;
            }
            else if (specialty == "Mage")
            {
                hp = 15;
            }
            else if (specialty == "Rogue")
            {
                hp = 20;
            }
            std::cout << "Your hp is " << hp << std::endl;
            return hp;
        };
        int setMP()
        {
            if (specialty == "Warrior")
            {
                mp = 5;
            }
            else if (specialty == "Mage")
            {
                mp = 15;
            }
            else if (specialty == "Rogue")
            {
                mp = 10;
            }
            std::cout << "Your mp is " << mp << std::endl;
            return mp;
        };
        void viewCharStats()
        {
            std::cout << "Name: " << name << std::endl;
            std::cout << "Race: " << race << std::endl;
            std::cout << "Class: " << specialty << std::endl;
            std::cout << "HP: " << hp << std::endl;
            std::cout << "MP: " << mp << std::endl;
        };
};
int main()
{
    Character myChar; // Create new character object
    myChar.setName(); // Call setName method
    myChar.setRace(); // Call setRace method
    myChar.setSpecialty(); // Call setSpeciality method
    myChar.setHP(); // Call setHP method
    myChar.setMP(); // Call setMP method
    std::cout << myChar.name << std::endl;
    myChar.viewCharStats(); // Call viewCharStats method
    return 0;
};

возвращает:

$ g++ -o classes classes.cpp
$ ./classes
>> What is your name?
>> Daniel
>> What is your race? Choose between human, elf, or dwarf.
>> Elf
>> What is your specialty (or class)? Choose between warrior, mage,  
   or rogue.
>> Mage
>> Your hp is 15
>> Your mp is 15
>> Daniel
>> Name: Daniel
>> Race: Elf
>> Class: Mage
>> HP: 15
>> MP: 15

Спасибо, отважные читатели, за то, что снова присоединились ко мне в новом путешествии по серии Python - C ++. Надеюсь увидеть вас в следующий раз, и, как всегда, продолжайте повторять и счастливого кодирования!