Заметки по Python (12): наследование, такое как объектно-ориентированное программирование

Python Nuggets Technology требует докладов
Заметки по Python (12): наследование, такое как объектно-ориентированное программирование

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.

Привет всем, яодна чаша в неделю, передняя часть, которая не хочет быть пьяной (завернутой). Если написанной статье посчастливилось получить вашу благосклонность, мне очень повезло~

понимание наследования

наследовать(Inheritance): Высокоуровневая абстракция для повторного использования кода.

  • Наследование — одна из квинтэссенций объектно-ориентированного проектирования.
  • Реализовано повторное использование кода уровня абстракции высокого уровня в модулях класса.
  • Наследование — это процесс, посредством которого вновь определенный класс может почти полностью использовать свойства и методы исходного класса.

image.png

Будь то базовый класс или производный класс, это просто оператор наследования, это обычный класс Python.

Его также можно разделить на подклассы, суперклассы и суперклассы.

Самый базовый класс - это базовый класс. После одного наследования можно получить производный класс. Его также можно наследовать снова, чтобы получить производный класс. Теперь самый базовый класс и первый унаследованный производный класс - это родительский класс и дочерний Отношение между производным классом и последним производным классом также является отношением между родительским классом и подклассом, в то время как самый базовый класс и последний производный класс относятся к отношению между суперклассом и подклассом

image.png

Производный класс может наследовать не только один базовый класс, но и несколько базовых классов, что является концепцией множественного наследования.

image.png

Построение наследования классов

Когда класс наследует, отношение наследования объявляется при его определении.Синтаксическая структура выглядит следующим образом.

class <派生类名>(<基类名>):  # 基类名可以带路径:ModuleNama.BaseClassName
    def __init__(self, <参数列表>):
        <语句块>
    ...

Производные классы могут напрямую использовать свойства и методы базового класса.

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

пример кода

class TestClass:
    def __init__(self, number):
        self.sum_number = 0
        for i in range(number + 1):
            self.sum_number += i

    def sum_num(self):
        return self.sum_number


class HumanNameClass(TestClass):
    def double_sum(self):
        return self.sum_number * 2  # 对基类属性的使用


value1 = HumanNameClass(100)
print(value1.sum_num())  # 5050  # 对基类实例方法的使用
print(value1.double_sum())  # 10100  # 对派生类实例方法的使用

В Python есть две функции, связанные с оценкой отношений наследования.

функция описывать
isinstance(object, classinfo) Определите, является ли объект объектом экземпляром classinfo или экземпляром подкласса, возвратите True или False
issubclass(class, classinfo) Определяет, является ли класс параметра подклассом параметра типа classinfo, и возвращает True или False.

Возьмите код выше,

print(isinstance(value1, TestClass))  # True
print(isinstance(value1, HumanNameClass))  # True
print(isinstance(value1, int))  # False
print(issubclass(HumanNameClass, TestClass))  # True
print(issubclass(TestClass, HumanNameClass))  # False

Самый простой класс в Python

Поскольку все в Python является объектом, любой класс также является объектом, и все типы данных в Python также являются объектами; самым основным классом, предоставляемым языком Python для всех классов, является объект.

  • объект — это существительное самого основного класса Python, перевод не требуется
  • Все объекты наследования по умолчанию, если они определены
  • Сохраненные свойства и сохраненные методы по существу являются свойствами и методами класса объекта.

образец кода

print(object.__name__)  # 打印object的名字  # object
print(object.__bases__)  # 打印object所继承的类名称  # ()
print(object.__doc__)  # 打印object类描述  # The most base type
print(object.__module__)  # 打印object所在模块的名称  # builtins
print(object.__class__)  # object所对应的类信息  # <class 'type'>

Три элемента объекта Python

  • логотип identity: объект не меняется после создания, используйтеid()Получить, обычно адрес памяти
  • тип type: тип объекта, сtype()получить
  • ценность value: разделен на переменнуюmutableс неизменнымimmutableдва

Две встроенные функции Python, связанные с базовыми классами

функция/ключевое слово описывать
id(x) Возвращает идентификатор x. в CPythonid()Функция используется для получения адреса памяти объекта.
x is y Оцените, равны ли тождества x и y, верните True или False и не оценивайте значение

Перегрузка классов Python

Перегрузка — это определение свойства или метода базового класса в производном классе.

  • Перегрузка свойств: производный класс определяет и использует свойство с тем же именем, что и у базового класса.
  • Перегрузка метода: производный класс определяет и использует метод с тем же именем, что и у базового класса.

перегрузка свойств

Перегрузка атрибутов использует принцип ближайшего покрытия, и перегрузка не требует специальной маркировки. Шаги метода

  1. Предпочитать свойства и методы, переопределенные производными классами
  2. Затем найдите свойства и методы базового класса.
  3. Поиск свойств и методов суперкласса

пример кода

class TestClass:
    text = "这是基类的类属性"

    def __init__(self, number):
        self.sum_number = 0
        for i in range(number + 1):
            self.sum_number += i

    def sum_num(self):
        return self.sum_number


class HumanNameClass(TestClass):
    text = "这是派生类的类属性"  # 类属性重载

    def __init__(self, number):
        self.sum_number = 1000  # 实例属性重载

    def double_sum(self):
        return self.sum_number * 2


value1 = HumanNameClass(100)
print(TestClass.text)  # 这是基类的类属性
print(value1.text)  # 这是派生类的类属性
print(value1.sum_num())  # 1000

перегрузка метода

Перегрузка метода — это определение метода базового класса производным классом, она делится на полную перегрузку и инкрементную перегрузку.

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

Определите метод с тем же именем непосредственно в производном классе

образец кода

class TestClass:
    def __init__(self, number):
        self.sum_number = 0
        for i in range(number + 1):
            self.sum_number += i

    def sum_num(self):
        return self.sum_number


class HumanNameClass(TestClass):

    def sum_num(self):  # 方法的重建
        return self.sum_number * 2


value1 = HumanNameClass(100)
print(value1.sum_num())  # 10100

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

class <派生类名>(<基类名>):
    def <方法名>(self, <参数列表>):
        super().<基类方法名>(<参数列表>)
        ...

Использование инкрементной перезагрузкиsuper()функция

образец кода

class TestClass:
    def test_text(self):
        print("这是基类的方法")


class TestClass1(TestClass):
    def test_text(self):  # 增量重载
        super().test_text()
        print("这是新增的方法里面的语句")


doc1 = TestClass()
doc2 = TestClass1()
print(doc1.test_text())
print(doc2.test_text())
'''
---输出结果---
这是基类的方法
None   # 因为函数没有返回值
这是基类的方法
这是新增的方法里面的语句
None  # 因为函数没有返回值

'''

Множественное наследование классов

Конструкция множественного наследования заключается в объявлении отношения наследования во время определения, а структура синтаксиса

class <类名>(<基类名1>, <基类名2>,..., <基类名N>):  # 基类名可以带路径:ModuleNama.BaseClassName
    def __init__(self, <参数列表>):
        <语句块>
    ...

Множественное наследование в Python использует подход в глубину слева направо. Так называемая глубина сначала слева направо состоит в том, чтобы начать с самого левого, чтобы найти его базовый класс.Если базовый класс не смотрит вверх, пока не будет найден самый базовый класс объектов, он начнет искать вправо .

image.png

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

Конструктор также следует вышеуказанным принципам,super()Также обратитесь к вышеуказанным принципам

Порядок нескольких базовых классов является ключевым

образец кода

class Test1:
    def test(self):
        text = "这是基类1"
        return text


class Test2:
    def test(self):
        text = "这是基类2"
        return text


class Test3(Test1, Test2):
    pass


class Test4(Test2, Test1):
    pass


value1 = Test3()
value2 = Test4()
print(value1.test())  # 这是基类1
print(value2.test())  # 这是基类2

Последовательно определяем результат вывода

Понимать концепцию наследования, конструкцию наследования классов, понимать, что объект — это самый базовый класс в Python.

Принцип перегрузки свойств класса — это последний принцип

Перегрузка методов класса: перезагрузка аналогична перегрузке атрибутов класса, используется инкрементная перегрузкаsuper()функция

Метод, используемый множественным наследованием, - сначала в глубину, слева направо.