Объектно-ориентированное программирование для изучения Python

искусственный интеллект Python

Учебный каталог Python

  1. Использование Python3 под Mac
  2. Типы данных для изучения Python
  3. Функция обучения Python
  4. Расширенные возможности обучения Python
  5. Функциональное программирование для изучения Python
  6. Модуль обучения Python
  7. Объектно-ориентированное программирование для изучения Python
  8. Расширенное объектно-ориентированное программирование для изучения Python
  9. Отладка ошибок и тестирование обучения Python
  10. Программирование ввода-вывода для изучения Python
  11. Процесс обучения Python и поток
  12. Регулярность изучения Python
  13. Общие модули для изучения Python
  14. Python обучение сетевому программированию

Объектно-ориентированное программирование — объектно-ориентированное программирование, сокращенно ООП, — это своего рода идея программирования. ООП рассматривает объект как базовую единицу программы, объект содержит данные и функции для управления данными.

класс и экземпляр

определение

class Student(object):
    pass

stone = Student()
stone.name = "stone"
stone.age = 2

print(stone.name, stone.age)

В приведенном выше коде:

  • за классом следует имя класса, которое начинается с заглавной буквы
  • (объект) — это класс, от которого наследуется класс
  • При использовании вы можете свободно привязывать свойства к переменным экземпляра

метод

class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def print_info(self):
        print(self.name, self.age)
        
stone = Student("stone", 18)
stone.print_info()

В приведенном выше коде:

  • __init__Первый параметр метода всегдаself, представляющий сам созданный экземпляр, поэтому в__init__Внутри метода вы можете привязывать различные свойства кself,так какselfПросто укажите на созданный экземпляр. Подобно конструктору java.
  • определить метод, за исключением того, что первый параметрselfКроме этого, остальные такие же, как и обычные функции. Чтобы вызвать метод, просто вызовите его непосредственно в переменной экземпляра, за исключениемselfПередавать не нужно, остальные параметры передаются нормально.

ограничение посещения

  • Если имя переменной экземпляра начинается с__В начале она становится приватной переменной (private), доступ к которой возможен только внутри, а не снаружи.
  • имена переменных, такие как__xxx__, то есть те, которые начинаются с двойного подчеркивания и заканчиваются двойным подчеркиванием, являются специальными переменными, и к специальным переменным можно обращаться напрямую, а не к закрытым переменным.

Наследование и полиморфизм

В ООП-программировании, когда мы определяем класс, мы можем наследовать от существующего класса, новый класс называется подклассом (Subclass), а унаследованный класс называется базовым классом, родительским классом или суперклассом (Base class, Super class). . То же, что джава.

Статические языки против динамических языков:

Для статических языков (например, Java), если вам нужно передатьAnimalтип, входящий объект должен бытьAnimalтип или его подклассы, в противном случае будет невозможно вызватьAnimalметод в . Для динамических языков, таких как Python, нет необходимости передаватьAnimalтип. Нам просто нужно убедиться, что входящий объект имеетAnimalметод в .

информация об объекте

использовать тип()

>>> import types
>>> def fn():
...     pass
...
>>> type(fn)==types.FunctionType
True
>>> type(abs)==types.BuiltinFunctionType
True
>>> type(lambda x: x)==types.LambdaType
True
>>> type((x for x in range(10)))==types.GeneratorType
True

Как видно из приведенного выше кода, судить о базовом типе данных можно напрямуюint,strи т. д., но что, если вы хотите определить, является ли объект функцией? можно использоватьtypesКонстанты, определенные в модулях.

использовать isinstance()

>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
Tru

Вы можете судить, является ли переменная одним из некоторых типов, например, приведенный выше код может судить, является ли это списком или кортежем.

использовать каталог()

Если вы хотите получить все свойства и методы объекта, вы можете использоватьdir()функция, которая возвращает список строк, например, чтобы получить все свойства и методы объекта str:

>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

похожий__xxx__Атрибуты и методы используются в Python для специальных целей, таких как__len__Метод возвращает длину. В Python, если вы позвонитеlen()Функция пытается получить длину объекта, фактически вlen()Внутри функции он автоматически вызывает объект__len__()метод, поэтому следующий код эквивалентен:

>>> len('ABC')
3
>>> 'ABC'.__len__()
3

Класс, который мы написали сами, если мы также хотим использоватьlen(myObj)Если да, то напишите свой__len__()метод:

>>> class MyDog(object):
...     def __len__(self):
...         return 100
...
>>> dog = MyDog()
>>> len(dog)
100

Недостаточно просто перечислить свойства и методы, сотрудничать сgetattr(),setattr()а такжеhasattr(), мы можем напрямую управлять состоянием объекта:

>>> class MyObject(object):
...     def __init__(self):
...         self.x = 9
...     def power(self):
...         return self.x * self.x
...
>>> obj = MyObject()

Далее вы можете проверить свойства объекта:

>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19

Вы также можете получить методы объекта:

>>> hasattr(obj, 'power') # 有属性'power'吗?
True
>>> getattr(obj, 'power') # 获取属性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn() # 调用fn()与调用obj.power()是一样的
81

Атрибуты экземпляра и атрибуты класса

Сам класс должен связать свойство:

class Student(object):
    name = 'Student'

Когда мы определяем атрибут класса, хотя этот атрибут классифицируется как все, доступ ко всем экземплярам класса возможен. Давайте проверим это:

>>> class Student(object):
...     name = 'Student'
...
>>> s = Student() # 创建实例s
>>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
Student
>>> print(Student.name) # 打印类的name属性
Student
>>> s.name = 'Michael' # 给实例绑定name属性
>>> print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael
>>> print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student
>>> del s.name # 如果删除实例的name属性
>>> print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student

Далее: Расширенное объектно-ориентированное программирование для обучения Python