day14学习总结
1. 编程思维
- 编程思想 - 程序员在遇到问题解决问题的思维模式
- 面向过程编程 - 基本语法,逻辑
- 函数式编程 - 掌握函数 (遇到问题先想有没有一个已经存在的函数具备解决这个问题的能力,如果有直接调用,没有就创建一个这样的函数)
- 面向对象编程 - 类,对象(变量函数)
2. 类
-
什么是类:就是拥有相同功能和相同属性的对象的集合 - 抽象的概念(类就是类型,类别)
-
对象就是类的实例(类具体的表现),比如说人是类,具体的一个(多个)人就是它的对象。list是类,具体的某一个列表是list的对象
-
(定义类)创建类 - 用代码描述清楚这个类是拥有哪些相同功能(功能 - 函数)和哪些相同属性(属性 - 保存数据的变量)的对象的集合
-
语法:
# 语法: class 类名: 类的说明文档 类的内容 # 说明 class - 关键字,固定写法 类名 - 程序员自己命名(规范,采用驼峰式命名并且首字母大写(类名大写开头,驼峰式指的是从第二个单词开始首字母大写)) 类的说明文档 - 多行注释 类的内容 - 相同功能和相同属性 由方法(对象方法,类方法,静态方法)和属性(对象属性,类属性)组成 方法 - 定义在类中的函数 属性 - 定义在类中的变量
-
举例:
class Person: '''人类''' num = 64 # num是属性 def eat(self): # 吃是方法 print("吃") def sleep(self): # 睡是方法 print("睡")
-
3. 类中的方法
-
方法 - 定义在类中的函数,用来描述具备的功能
-
对象方法:
- 怎么定义:将函数直接定义在类中
- 怎么调用:通过对象来调用 - 对象.xxx
- 特点:自带参数self,通过调用对象方法的参数是self不需要传参,系统自动将当前对象传给self
- 创建类的对象的时候需不需要传参,需要几个参数,由类中__init__方法决定
- 什么时候用:如果实现函数的功能需要用到对象属性就是用对象方法
class A: def func1(self): print("对象方法") a = A() a.func1() # 通过对象调用对象方法
-
类方法:
-
怎么定义:定义函数前加装饰器“@classmethod”
-
怎么调用:通过类来调用 - 类.xxx
-
特点:自带参数cls,调用的时候不需要传参,系统自动将当前类传给cls
-
什么时候用:如果实现函数的功能不需要对象属性需要类就使用类方法
class B: @classmethod def func2(cls): print("类方法") B.func2()
-
-
静态方法:
-
怎么定义:定义函数前加装饰器“@staticmethod”
-
怎么调用:通过类来调用 - 类.xxx
-
什么时候用:实现函数的功能既不需要对象也不需要类就使用静态方法
class C: @staticmethod def func3(): print("静态方法") C.func3()
-
4. 初始化方法
-
魔方方法:方法名以__开头并且以__结尾的自带的方法,所有的魔法方法多会在特定的情况下被自动调用
-
常用的魔方方法:
-
__init__方法:
创建类的对象的时候会自动调用类中的__init__方法,在内中添加__init__方法的时候,除了方法名和方法类型不能动,可以随意添加参数和随意添加函数体
class B: def __init__(self): print("a") b1 = B() b2 = B() #自动调用 class C: # 在类中添加__init__方法的时候,除了方法名和方法类型不能动,可以随意添 def __init__(self,x,y): print("C的init方法",x,y) # 创建类的对象的时候需不需要传参,需要几个参数,由类中__init__方法决定 c1 = C(2,3)
-
__repr__方法:
打印对象的时候会自动调用对象对应的类中的__repr__方法,来定制打印规则(函数的返回值是什么,对象的打印结果就是什么)返回值必须是字符串
-
5. 属性
-
属性:分为对象属性和类属性两种
-
类属性
怎么创建:在类中直接定义一个变量。
怎么使用:通过类来使用 - 类.xxx。
什么时候用:当属性值不会因为对象不同而不一样的时候就使用类属性。
-
对象属性
怎么创建 - 以"self.属性名 = 值"的形式定义在类__init__方法。
怎么使用 - 通过对象来使用 对象.属性名。
什么时候用 :当属性值会因为对象不同而不一样的时候就使用对象属性。class A: x = 100 # x是类属性 def __init__(self): self.name = "小明" self.num = 10 print(A.x) # 使用类属性 A.x = 200 print(A.x) # 修改类属性值 a = A() print(a.name,a.num) # 使用对象属性 a.name = "小红" a.num = 11 print(a.name,a.num) # 修改对象属性
-
-
对象属性赋初始值的方式:
-
赋固定的值(很好用)
-
使用没有默认值的参数来赋值
-
使用有默认值的参数来赋值
-
举例1:
class Person: def __init__(self,name,gender = "男"): #gender赋固定的值 self.name = name self.age = 0 self.gender = gender def __repr__(self): # return str(self.__dict__) return f"<{str(self.__dict__)[1:-1]}>" # 定制了一个打印规则 a = Person("小明") print(a)
-
举例2:
# 创建一个矩形类(根据生活扩展类的内容 class Rectangle: def __init__(self,length,width): self.l = length self.w = width def get_Perimeter(self): return (self.l + self.w) *2 def get_area(self): return self.l * self.w def __repr__(self): return f"长度:{self.l},宽度:{self.w},面积:{self.get_area()},周长:{self.get_Perimeter()}" a1 = Rectangle(5,8) print(a1)
-
-
属性的增删改查
-
在面向对象编程的时候,可以直接使用对象来代替字典
-
查操作:获取属性值
-
对象.属性 - 获取指定属性的值
-
getattr(对象,属性名) - 获取指定属性的值
-
getattr(对象,属性名,默认值) - 获取指定属性的值,属性不存在直接返回默认值
-
-
增,改
- 对象.属性 = 值 - 当属性存在的时候修改指定属性对应的值;当属性不存在的话就给对象添加属性
- setattr(对象,属性名,值) - 当属性存在的时候修改指定属性对应的值;当属性不存在的话就给对象添加属性
-
删除
- del 对象.属性名 - 删除指定属性的值
- delattr(对象,属性名) - 删除指定属性的值
-
hasattr:判断属性是否存在
- 语法:hasattr(对象,属性名)
class Students: def __init__(self,name,age = 18 ,score = 0): self.name = name self.age = age self.score = score def __repr__(self): return str(self.__dict__) # 查操作:获取属性值 stu1 = Students("小明",20,76) stu2 = Students("小红",64) print(stu1,stu2) print(stu1.name) # 对象.属性 - 获取指定属性的值 print(getattr(stu1,"age")) # getattr(对象,属性名) - 获取指定属性的值 print(getattr(stu2,"gender","女")) # 增,改 stu1.name = "小华" print(stu1) stu2.id = "001" print(stu2) setattr(stu1,"id","002") setattr(stu2,"id","003") print(stu1) print(stu2) # 删除 del stu1.score print(stu1) delattr(stu2,"score") print(stu2) ''' hasattr:判断属性是否存在 hasattr(对象,属性名) ''' print(hasattr(stu2,"name")) print(hasattr(stu1,"score"))
-
6. 继承
-
继承: - 让子类直接拥有父类的属性和方法
- 父类就是一个大的类,子类是这个大的类下面的一个小的分类
-
语法:
class 类名(父类) 类的说明文档 类的内容 注意:定义类的时候如果没有写父类,这个类默认继承object(基类)
-
子类添加内容:子类在拥有父类的属性和方法的同时,往往需要由属于自己特有的一些属性和方法
- 添加类属性和方法:直接在子类中定义新的类属性和新的方法
- 添加对象属性:super().__init__() - 调用当前类的父类的__init__()