简述面向对象编程思想

219 阅读6分钟

什么是对象?

需了解面向对象,理解核心上在于理解"对象"

从目的上来说,对象的终极奥义是将程序的功能、数据、来整合、封装后的一个接口
以用户的视角,即还未对面向对象有所理解的朋友,可以将对象理解为是一个"容器",用来盛放数据与功能,当需要什么就从中去取就好了
比如就拿你的对象举例(虽然可能没有doge),我们来代入:将你的对象先基于上面的话理解为一个对象,其数据包括:姓名、性别、年龄等等....功能包括:陪你吃饭、陪你学习、陪你暖床等等.....

而怎样创造一个对象呢?我们首先需要创建一个,我们深入一些理解面向对象,从开发者角度上来说,类其实才是一个真正的"容器",而对象更像是一个管道让你能直接通过该管道去取到容器中你需要的东西(数据、功能...)

类用来存放该类的对象所共有的数据与功能,节约内存空间与代码冗余,这种编程思想是基于人们一般的思维方式,现在我们试着将人平常的思维方式与程序语言结合去理解面向对象:

比如:“人类是动物”,动物为一个类而人是一个该类中的对象,动物(大部分)有名字、性别、年龄,这些都是类中的属性(数据),有吃饭、睡觉、谈恋爱这些方法(功能),而对象是这些属性、方法得以实践的载体,广说一个类有什么、能干什么是不是听起来很奇怪?所有需要一个实例化的对象,来把对象所在的类中的各种属性、方法得以表达、实践,这个实例化的过程,也称为"调用",调用类产生了对象

类的属性与创造(python为例)

什么是类?

类是具有相似数据与功能的对象的集合体
类体中最常见的是变量与方法的定义,但是类体其实是可以包含任意其他代码的,即在类体外你干过什么,想在类体中做都可以,不太过分就行(doge)
注意:类体代码是在类定义阶段就会立即执行,即会产生类的名称空间

查看名称空间的方法如下:

类名.__dict__  查看类的名称空间,相当于查看其储存的数据
类名.方法或变量名   查看属性的名称空间

类可以访问:

1.类的数据属性     
2.类的方法属性

类中的东西是给对象用的:
1.类的数据属性是共享给所有对象用的,所有对象访问的地址都一样
2.类的方法是绑定给对象用的,不同的对象

类的初始化

类的初始化可以类比理解为我们每个人出生后的初始化一样,如果把我们人类看作一"类",我们在出生后(正常出生)都会有一些属性是共有的,比如名字、性别、出生日期,类的初始化与此大致相同,这种初始化的目的旨在把这一类所有的对象所共有的属性给罗列出来,再比如小狗这一类共有的有年龄、性别、主人等...菜这类共有的可以有所属厨师、菜品、所属餐厅等...

python中有专门的方法用于类的初始化,为__init__方法

一些机制

1.会在调用类时自动触发执行,用来为对象初始化其独有的数据
2.__init__内应该存放的是为对象初始化属性的功能,但是是可以存放任意其他代码,会在调用时立刻执行
3.__init__方法必须返回None

代码实现

比如对于学生这样一个类,可以简单初始化为:

class Student:
    def __init__(self, name, age, gender):                           # 类调用阶段才会运行
        self.name = name
        self.age = age
        self.gender = gender

其有一个参数是固定不动要传入的,即self,当然这个参数名也可以该,但第一个要传入的参定是固定的,python定义self是为什么?这个self,其实指的就是对象自己,即第一个参数传入的是将该类实例化的对象

注意,name、age什么的都是你给这个方法传入的参数,你需要将这些意义很明显的参数和对象进行绑定,否则怎么初始化咧,即是后续的self.name = name....

类的实例化

上文我们就讲到,对象就是类的实例化,为了使我们对此理解能更深刻,我们需要理解其中的机制
类的实例化过程中,发生了三件事:

1.先产生一个空对象
2.会自动调用类中的__init__方法,将空对象已经调用类时括号内传入的参数一同传给__init__
3.返回初始化完的对象

一个类的简单实例

class Student:

    stu_school = 'Whut'                    # 类的所有属性
    count = 0                              # 用于计数

    def __init__(self, name, age, gender):            # 类调用阶段才会运行
        self.name = name
        self.age = age
        self.gender = gender
        Student.count += 1                  # 用于给创建的对象数进行计数

    def show_info(self):                    # 类中的方法,写法和用法和函数基本一致
        print(f'学生姓名:{self.name} 学生年龄:{self.age} 学生性别:{self.gender}')

    def set_info(self, name, age, gender):     
        self.name = name                    
        self.age = age
        self.gender = gender


xiaoming = Student('xiaoming', '20', 'male')        # 实例化对象
xiaohong = Student('xiaohong', '19', 'female')

print(Student.count)                        # 对象调用类中的变量

print(xiaoming.stu_student)

Student.show_info(xiaoming)                 # 对象调用类中的方法
xiaohong.show_info()

属性查找顺序与绑定方法

属性查找顺序:

属性查找顺序:先在对象中找后到类中找,这个和使用函数时我们理解的名称空间有点像,先在对象中找往往是在初始化中属性中找,这就类似于函数中找一个变量优先在函数自己的名称空间里找,如果找不到就会在类中找,类就是对象的工具陈列室,比如上述例子中的stu_school,对象本身是没有的,而类中有就可以供对象调用,这就类似于如果在函数中声明某一个变量为全局变量

绑定方法

绑定方法的特殊之处在于:谁来调用绑定方法就会将谁当做第一个参数自动传入,即我们之前说到的self(通常这个位置以self命名)

作用机制

对象调用方法的时候会被分配一个独立的内存地址,该地址类似于链接的作用,可以使得对象找到类中的该方法并进行调用,且自动传入了第一个参数

以上内容中若有不当之处,恳请您不吝指出!