前言
面向对象编程:Object Oriented Programming,简称OOP,是一种程序设计思想。
需要注意的是,与之对应的是面向过程编程思想。实际上,能够使用面向对象编程思想实现的程序,也都能通过面向过程完成。只是看哪种思想更适合当前开发需求
面向过程与面向对象区别
面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定到一起,进行封装。减少重复代码的重写过程
概念 | 描述 |
---|---|
类(Class) | 用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。其中的对象被称作类的实例。 |
对象 | 也称实例。通过类定义的初始化方法,赋予具体的值,成为一个"有血有肉的实体"。 |
实例化 | 创建类的实例的过程或操作。 |
实例变量 | 定义在实例中的变量,只作用于当前实例。 |
类变量 | 类变量是所有实例公有的变量。类变量定义在类中,但在方法体之外。 |
数据成员 | 类变量、实例变量、方法、类方法、静态方法和属性等的统称。 |
方法 | 类中定义的函数 |
静态方法 | 类方法是将类本身作为对象进行操作的方法。 |
方法重写 | 如果从父类继承的方法不能满足子类的需求,可以对父类的方法进行改写,这个过程也称override。 |
封装 | 将内部实现包裹起来,对外透明,提供api接口进行调用的机制 |
继承 | 即一个派生类(derived class)继承父类(base class)的变量和方法。 |
多态 | 根据对象类型的不同以不同的方式进行处理。 |
类
类是抽象的概念,仅仅是一个模板。用于,描述具有相同属性和方法的对象的集合。比如"编程语言"是一个类
类的构成
类由3个部分构成
类的名称:类名
类的属性:一组数据
类的方法:允许对类进行操作的方法
类的定义
python中使用class关键字来定义类
类名通常采用驼峰式命名方式,尽量让字面意思体现出类的作用
class 类名:
对象(实例)
某一个具体事物的存在,在现实世界中可以是看得见摸得着的。比如"python"就是一个对象
创建对象(实例化对象)
python中,可以根据已经定义的类去创建一个个对象
创建对象的格式:
对象名 = 类名()
class LagicStudents(object):
def study(self, language): # 实例方法有一个参数self,指的是实例对象
print(language)
l1 = LagicStudents()
l2 = LagicStudents()
通过一个类可以创建无数个对象,每个对象在内存中都会开辟新的空间
✅调用类中的实例化对象
①使用 对象名.方法名(参数) 调用的方式,不需要传递self。
②使用 类名.方法名(self, 参数) 的方式,不会自动给 self 传参,需要手动的指定self。
class LagicStudents(object):
def study(self, language): # 实例方法有一个参数self,指的是实例对象
print(language)
l1 = LagicStudents()
# 通过对象名.方法名(参数)调用
l1.study('python')
# 通过类名.方法名(self,参数),需要手动传参
LagicStudents.study(l1, 'python')
举个栗子
✦创建类:学生类
✦创建对象:居然
✦在类中定义方法输出:居然学习python
class LogicStudents:
def study_python(self):
print("居然学习python")
jr = LogicStudents() # 实例化的过程
jr.study_python() # 通过对象.方法()去调用类中的方法
类与对象的关系
✦类是模板,对象是根据类这个模板创建出来的,应该先有类,再有对象。
✦使用同一个类,能够创建出很多对象。
✦类中定义了什么属性和方法,对象中就有什么属性和方法。
✦不同对象对应的属性值也会不同。
总结:
✦创建对象的过程就是实例化
✦通过对象.方法()调用类中的方法
✅self参数
self表示当前对象
self并不是一个关键字,其实可以是任意的标识符,为了表达代表的是当前对象自己,习惯使用self表示
调用实例函数的时候,self不需要手动传参,系统会自动传递当前的对象
哪个对象调用了方法,方法里的self指的就是谁。
通过 self.属性名 可以访问到这个对象的属性。
通过 self.方法名() 可以调用这个对象的方法。
类属性
✅访问的两种方法
①通过类名.属性名访问
②通过实例对象.属性名访问
class LogicStudents():
students_num = 100 # 类属性
sn = LogicStudents()
print(LogicStudents.students_num) # 通过类名.类属性访问
print(sn.students_num) # 通过实例对象.类属性访问