面向对象

  • 简单的代码操作 -> 基础语法,堆叠功能[变量、数据类型、运算、if、while]
  • 函数式编程 -> 将所有要处理的事情,开始封装成具备一定处理功能的函数,调用执行。

面向过程编程
面向指设身处地换位思考。
面向过程指:开发人员在完成这件事情时需要按照什么样的步骤进行操作,将这样的操作步骤封装在函数中,通过函数可以调用执行。这样的开发操作~代码中封装了大量的包含处理步骤的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。
面向过程编程适合中小型项目开发;大型项目开发[代码的逻辑处理方式不够成熟,导致代码高耦合!

面向对象:面向对象(Object Oriented,OO)是软件开发方法。面向对象是一种对现实世界理解和抽象的方法。把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象,对同类对象抽象出其共性,形成类。
面向对象是一种编程思想[处理问题的思路]。

万物皆对象,对象:类型、特征、行为。
生活中的类型和事物,类型是事物抽象出来的一个称呼/概念。事物是属于某种类型的一个具体存在的物体。

面向对象编程
Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的方法(函数)。是对面向过程编程的补充和完善,通过对象和对象之间的交互协作完成项目功能的开发。

面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。

生活:大型生活场景|大型项目:需要大量的人员分工协作,共同完成上市公司的运营
代码:大型项目开发|,需要大量的[类型、函数]对象分工写作,共同完成项目功能的开发

类:代码中可以通过class关键字,自定义一个数据类型
(1)数据类型:简称类型:简称类是一种自定义数据类型-> 自定义 类。
类:类型的简称,数据类型的简称;是一堆具有共同属性和相似行为的对象的抽象,是一个概念、一个称呼、一个类型。
(2)基本语法:

class 类型名称:
    类型中的代码

python中:类型的后面可以不添加括号[默认继承了object类型]
class Pet: == class Pet(object): == class Pet():

(3)类型名称命名规范:见名知意、驼峰命名法[一个或者多个英文单词组成、每个单词首字母大写]
(4)类型:通过项目中需要的大量有相似特征和行为的对象,抽象出来的一个数据类型

对象

对象:有具体特征和行为操作的事物
代码:有具体(特征)属性和(行为)方法的对象-> 事物
对象:一种类型有具体数据的实体[实际存在的物体];是某种类型下一个有具体特征数据和操作方法的实体对象,对象有具体的数据!

对象:是有特征的

对象是有特征的,项目需要这样的特征,就定义它,如果不需要就忽略它!
语法:对象的特征~是需要在类型中定义的!
在通过类型创建对象时,才会给具体的特征赋值
给对象的特征赋值,固定语法:在__init__()函数中操作

class Author:
    # 给对象的特征赋值,在__init__()中进行操作
    def __init__(self, username, password, nickname):
        self.username = username
        self.password = password
        self.nickname = nickname

python中通过类型创建对象[a = Author()]会自动调用__init__()方法

创建对象a = Author()-> Author.new()方法创建对象
-> Author.init()方法初始化数据
-> 得到一个Author对象

对象,是有行为的

对象的行为,分析是否和对象本身的数据有关!
生活:分析行为是否跟自己的身份和责任有关!

对象的行为:对象的方法就是一个普通函数的升级,将一个函数,定义在类型的内部,第一个参数~设置为可以接受对象的参数:self。

class Author:

    # 定义一个行为:个人介绍
    def introduction(self):
        print("个人介绍.........")

注意:方法和函数的最大的区别:第一个参数可以隐式接受当前对象作为实际参数,方法是定义在类型的内部的!方法的调用必须通过对象的引用变量调用。
函数中的任何形式参数,在调用的时候都需要明确的传递数据,函数是定在在类型的外部的!函数的调用直接通过函数名称调用。

调用执行方法:类似与调用执行函数

# 方法的调用执行:必须通过对象的引用变量进行调用!
author = Author()
author.introduction()

在Python中,有一种特殊的函数:魔法函数,每个魔法函数有一些特定的功能,方法名称都是固定的,魔法函数的命名规则:函数的前后各有两个下划线!

##类型和对象的区别
类型 VS 对象 区别

:通过对象抽象出来的一个数据类型。类中需要定义对象需要的特征[属性|变量]和行为[方法]。

class Person:
    # 定义属性、特征
    # 固定写法:在__init__方法中,定义类型的属性
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    # 定义方法、行为
    def eat(self, food):
        print("吃饭了")

注意1:class 关键字,用来声明定义一个类型,固定写法
注意2:类型中的所有函数,第一个参数self表示当前对象,类似生活中的一个名词:我
注意3:类型中的函数,必须称为方法。

函数 VS 方法 : 是两个东西
方法是一种特殊的函数,只能在类型中使用!
注意4:类型中方法,第一个参数:指代的是当前对象~~~一般被声明为self表示当前对象,调用的时候不需要传递数据给self!

对象:某种类型一个具体存在的事物。代码中的对象,需要通过类型来创建。
如:tom = Person(‘汤姆’, 18, ‘男’)

通过 类型名称() 的方式创建对象时,自动调用执行__init__()方法,将对象需要的数据传递过去。
有了对象,就可以执行对象的行为:调用对象的方法通过 对象的变量.方法()直接调用:
tom.eat("鱼香肉丝")

面向对象的特征

面向对象的特征:封装性、继承性、多态性!
面向对象的特征,是用于高度还原生活场景的特性!
因为有了这些特征操作,所以面向对象编程更加符合我们的生活场景

面向过程开发:代码之间的耦合度较高、导致扩展性较差!
面向对象开发:代码之间的耦合度较低,扩展性较好!

面向对象的魔法方法

dir(type)查看__base__、__subclasses__等方法

>> dir(type)
['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', 
'__class__', '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__', 
'__eq__', '__flags__', '__format__', '__ge__','__getattribute__', '__gt__', '__hash__', 
'__init__', '__init_subclass__', '__instancecheck__','__prepare__', '__qualname__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__','__sizeof__', '__str__', 
'__subclasscheck__', '__subclasses__', '__subclasshook__', '__text_signature__', 
'__weakrefoffset__', 'mro']
>>>

定义类

>>> class A:
...     pass
>>> class B:
...     pass
>>> class C(A):
...     pass
>>> class D(A):
...     pass
>>> class E(D):
...     pass
  • 查看父类__base__

怎么查看自己到底继承了那些父类:
魔法属性:类型名.base 查看当前类型继承的父类

>>> A.__base__
<class 'object'>

python3中所有的类型,都直接或者间接的继承自object类型。
python2中,所有类型都直接或者间接继承自type类型,object也是继承自type类型。
python2中一般会有这样的说法:type是所有类型的直接或者间接父类,object是所有对象的直接或者间接的父类。

  • 查看当前实例的类型

怎么查看当前类型: 通过类型的__class__魔法属性,直接查看,和type(类型名称)效果一致!
对象.class == type(对象)–> 得到当前对象的所属类型

>>> a = A()
>>>
>>> a.__class__  # 查看当前实例所属类型
<class '__main__.A'>
>>>
>>> A.__class__
<class 'type'>
>>>
  • 查看类型的所有子类

怎么查看当前类型的所有子类:通过类型的__subclasses__魔法函数,直接查看当前类型的所有子类。
语法:类型名.subclasses()

>>> A.__subclasses__()
[<class '__main__.C'>, <class '__main__.D'>]
>>>

tips:
项目中需要一个文章类型【需要定义一个类型】
文章需要如下信息:【类型中需要的属性】
标题、内容、作者

文章需要这样一些行为【类型中需要的方法】
获取当前文章标题
获取当前文章的内容
获取当前文章的作者

class Article:

    def __init__(self, title, content, author):
        self.title = title
        self.content = content
        self.author = author

    def get_title(self):
        return self.title

    def get_content(self):
        return self.content

    def get_author(self):
        return self.author