初识面向对象
1.编程范式(理解,科普用的)
编程范式:编程的规范,比如信封规范 面向对象是一种编程范式 1.过程化/命令式编程(面向过程)op 2.事件驱动编程 用户与程序交互的编程 3.面向对象编程 oop 4.函数式编程(以函数为主的编程)
1.2 面向过程
什么是面向过程:按照一步一步的流程进行编程 (基础课ATM项目) 比如: 洗衣机: 放衣服 --》 加洗衣粉 -》 加水 -》 漂洗 -》 脱水 代表语言:C, Basic
1.3 面向对象
看名字就是看重对象,当解决洗衣机问题的时候,把对象抽象成概念,后面再实例化 比如我们找对象: 先想一个模板: 要xxxx眼睛,xxxx鼻子,xxxx嘴巴 实例化(找类的一个具体例子)
2.类和对象
何为类, 何为对象 类:类别,模板 对象:例子 lol,王者 中单就是一个类别 (类) 具体英雄:亚索,王昭君(对象)
2.1类的定义与 实例化对象
格式: class 类名: 类代码(属性,行为) # 实例化对象 变量名 = 类名() 注意书写格式: 类名的定义: 使用大驼峰法命名方法 定义类中的变量就是属性,函数就叫方法
# Hero 就是名字的意思 # 所有同学不准用任何中文进行起名 # 第二个如果英文很烂,用拼音+注释 class Hero: # 开始写我们的代码 name = "英雄名字" hp = 0 # 护甲 armor = 0 move = 0 # 技能冷却 cd = 0 # 对象:一个个实际的例子 Garen = Hero() # 可以查询所有属性和方法名 # 我们的对象属性是要通过传入才有改属性值 print(Garen.__dict__) # 如果不想通过创建类传进去,想通过创建后传进去 # 我们可以通过属性名赋值,那么对象就有属性值 # garen英文有阉人,男孩子的名意味阉割 Garen.name = "盖伦" Garen.hp = 616 Garen.armor = 27 Garen.cd = 0 Garen.move = 340 print(Garen.__dict__) Teemo = Hero() print(Teemo.__dict__) Teemo.name = "提莫" Teemo.hp = 550 Teemo.move = 345 Teemo.cd = 0 print(Teemo.__dict__)
2.2 __init__ 初始化方法
实例化方法:构造方法,魔法方法 用于设计对象自身属性,这些都不需要手动调用(对象实例化就自动运行了) 因为实例化对象自动自行,配合self(自身)进行使用
2.3 self
self:就是对象自己的意思
# class就是类 class Hero: # init你可以粗暴理解为给对象创建属性的地方 # self,为什么每一次都需要它,因为self就是对象来的 # 我们知道局部变量在各个领域不互通,所有通过self传入达到互通 def __init__(self, name, say): # 对象名.变量名 = 数值 self.name = name self.say = say def info(self): print(f"{self.name}:{self.say}") # 类的实例化不是函数调用,和函数调用是一样的写法 garen = Hero("盖伦", "人在塔在") teemo = Hero("提莫", "提莫队长正在待命") # 对象名.方法名() # li.append() garen.info() teemo.info()
2.4 类文档
# 类文档和函数文档一样的 def func(): """ 这个是文档字符串 :return: """ print(func.__doc__) class A: """ 类文档: 不需要实例对象 就是类的书名数 """ # 打印类文档 print(A.__doc__)
二、封装
2.1、封装的定义
封装:密封包装 封:密封 装:包装 只能通过规定的方法访问数据,包装数据具有安全性,维护性和易用性 有写数据不想让别人知道,但是允许特定或者某些函数可以看到 怎么去隐藏这些数据呢? 实现封装的属性,不能直接访问,通过公共方法get/set访问
2.2、属性隐藏
在;类的定义中一些不愿意公开的,可以进隐藏(私有,private), 在属性名左边加上两个下划线就可以实现了隐藏(私有,private),只能内部类方法
class People: def __init__(self, name, age, height, face): self.name = name self.age = age self.height =height self.__face = face # 只用内部创建一个公共方法去访问才能知道或者改变里面的隐藏属性 # 输出数值 def getFace(self): return self.__face # # 修改数值 def setFace(self, face): self.__face = face ziliang = People("梓良", 18, 180, "帅哥") print(ziliang.name) # 我想改变face的数值 # 但是因为我没有办法直接去修改它 ziliang.name = "xxx" print(ziliang.name) ziliang.age = 22 print(ziliang.age) # 这里增加了一个普通下划线的属性 # ziliang.__face = "丑" # print(ziliang.__face) # print(ziliang.__dict__) print(ziliang.getFace()) ziliang.setFace("丑b") print(ziliang.getFace()) print(ziliang.__dict__) # print(ziliang.__dict__) # print(ziliang.name) # ziliang.age = 22 # print(ziliang.age)
3.property()函数
property 可以设置获取,修改以及删除对象的属性 格式: property(fget=None, fset=None, fdel=None) fget 是获取属性数值的方法 fset 是设置修改属性值的方法 fdel 是删除属性值的方法 property 就是把隐藏属性变成和普通属性一样的用法,规范代码用的
class People: def __init__(self, name, age, height, face): self.name = name self.age = age self.height =height self.__face = face # 只用内部创建一个公共方法去访问才能知道或者改变里面的隐藏属性 # 输出数值 def getFace(self): return self.__face # # 修改数值 def setFace(self, face): self.__face = face def delFace(self): # del 关键字 可以作用于所有领域,可以删除一切 del self.__face # 函数() 这个是函数调用 face = property(fget=getFace, fset=setFace, fdel=delFace) ziliang = People("梓良", 18, 180, "帅哥") # print(ziliang.getFace()) # ziliang.setFace("丑b") # print(ziliang.getFace()) ziliang.face = "丑b" print(ziliang.face) print(ziliang.__dict__) del ziliang.face print(ziliang.__dict__)