1. 面向对象的简介
- 1.1 面向过程
- 指将我们的程序分解为一个一个的步骤,通过对每个步骤的抽象来完成程序
- 面向过程的编程方式往往只适用于一个功能,如果要实现别的功能,往往复用性比较低
- 面向过程的编程方式更符合人类的思维,编写容易
- 1.2 面向对象
- 对象:就是在内存中指定来存储数据一块区域。
- 面向对象的编程语言,简单理解就是语言中的所有操作都是通过对象进行的,更多的关注是对象本身,而不注重过程,认为一切皆是对象
- 面向对象的编程思想,将所用方法和属性都统一保存到对应的对象中,要使用某个功能直接找到对应的对象即可。
- 这种编程方式比较容易阅读,结构清晰,并且容易维护,容易复用。但编写过程中不太符合常规的思维,编写相对麻烦
- 1.3 python是一门面向对象的编程语言,python中一切皆对象
2. 面向对象的结构
- 2.1 id (对象的唯一标识)
- 2.2 type(类型) 标识当前对象所属的类型
- 2.3 value(值) 对象中存储的具体数据
- 可变对象 和不可变对象
- 2.4 示例:
class MyClass: # 类名首字母大写,区别于Python的内建对象 pass print(MyClass) print(id(MyClass)) # 类也是一个对象,类是一个用来创建对象的对象 # 类是type类型的对象,定义类就是定义了一个type类型的对象 # 类在内存中也有自己的id,独立的内存空间 # 与C++语言中类有很大的区别,python中的类可以直接使用,而C++的类不能直接使用 print(type(MyClass)) # 结果<class 'type'>
- 运行结果:
- 运行结果:
3. 类
- 3.1 分类
- 内置对象:以前学的int、float、list、tuple、dict等,内置对象远远不能满足我们的开发需求
- 自定义对象:类本身 或 通过类生成的对象
- 语法:
- 不指定父类时,我们也可以这样写:
- 3.2 类就是对象的模型,可以根据类来创建特定的对象
- 3.3 对象是类的实例
- 示例:
class MyClass: pass mc = MyClass() # mc 是MyClass 的实例 print(isinstance(mc,MyClass))
- 运行结果:
True
- 3.4 如果多个对象通过一个类创建的,我们称这些对象是同一类对象
- 3.5 类也是一个对象,是用来创建对象的对象
- 3.6 可以向对象中添加变量,对象中的变量称为属性
-
示例:
mc = MyClass() # mc 是MyClass 的实例 mc.name = '黑蜘蛛' # 给对象中添加变量 print(mc.name)
-
运行结果:
-
4. 类的定义
- 4.1 类和对象都是对现实生活中事物的抽象
- 4.2 事物包含两部分:
-
数据:属性
-
行为:方法
-
给对象添加数据:对象.属性名=属性值
-
调用对象方法:对象.方法名()
示例:class MyClass: name = '哈哈哈' def speak(a): print("我是:哈哈哈") mc = MyClass() mc.speak()
-
运行结果:
-
- 4.3 方法调用和函数调用的区别
- 函数调用是有几个形参,就传几个实参。方法调用是默认传递一个参数,因此方法中至少有一个形参
- 4.4 类中属性和方法
- 一般情况下,对象的属性是对象私有的,保存在实例对象中,而对象的方法是同一类对象公有的,保存在类对象中
- 如果这个属性(方法)是所有实例共享的,则应该将其保存到类对象中
- 如果这个属性(方法)是某个实例独有的,则应该保存到实例对象中
- 类中定义的属性和方法都是公共的,任何该类的实例对象都可访问
- 4.5 属性和方法的查找流程
- 当我们调用一个对象的属性时,解析器会先在当前的对象中寻找是否存在该属性,如果存在则返回当前对象的属性值。如果没有找到,则去当前对象的类对象中去寻找,如果存在则返回类对象的属性值。如果没有就会报错
5. 参数
-
5.1 在调用类中的方法时,会自动传递一个self参数
-
5.2 类的方法中至少指定一个形参,而第一个形参接收的就是调用对象id,形参名字最好用约定的self,但用其他名字也不会报错
-
5.3 self 总是指向调用类的实例对象
-
示例:
class MyClass: name = '' # self指明调用类的实例对象 def speak(self): print("我是:",self.name) mc = MyClass() mc1 = MyClass() mc.name = 'MC' mc1.name = 'MC1' mc.speak() mc1.speak()
- 运行结果:
- 运行结果: