这里写目录标题
目标
- 面向对象的三大特性
- 类属性和实例属性
- 类方法和静态方法
一 面向对象的三大特性
- 封装
– 将属性和方法书写到类的里面的操作即为封装
– 封装可以为属性和方法添加私有权限 - 继承
– 子类默认继承父类的所有属性和方法
– 子类重写(覆盖)调用父类的属性和方法 - 多态
– 传入不同的对象,产生不同的结果
二 多态
2.1 了解多态
多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承).
- 定义:多态是一种使用对象的方式, 子类重写父类方法, 调用不同的子类创建对象的相同父类方法,可以产生不同的执行结果. 即 传入不同的对象,产生不同的结果.
- 好处: 调用灵活,有了多态,更容易编写出通用的代码, 做出通用的编程,以适应需求的不断变化.
- 实现步骤
– 定义父类,并提供公共方法
– 定义子类,并重写父类方法
– 传递子类对象给使用者,可以看到不同子类执行效果不同
2.2 体验多态
[需求] 警察带警犬工作, 警犬有两种工作犬,执行不同的任务
[分析]
0 上归类 警察 追踪犬 缉毒犬 再弄个父类警犬
1 定义父类 提供公共方法
2 定义子类 重写父类同名方法
3 定义警察类 ,这个要 设置形参, 形参.函数名()
[代码]
# --*coding:utf-8*--
"""
[多态]
[需求 验证不同的对象,产生不同的执行结果]
[事件 不同的警犬,协助警察完成工作]
[分析 上归类 父类:警犬 子类:缉毒犬和追踪犬 警察类 ]
[步骤]
1,定义父类 并提供公共方法
2,定义子类 并重写父类方法
3,创建对象,调用不同的功能, 传入不同的对象,观察不同的执行结果
"""
# 定义父类 ,提供公共方法
class 警犬(): #定义父类,提供公用方法,可以四pass空
def 工作(self):
print("协助警察工作")
# 定义子类 ,重写父类方法
class 追踪犬(警犬): # 定义子类,重新父类同名方法
def 工作(self):
print("追踪坏人")
class 缉毒犬(警犬):
def 工作(self):
print("找寻毒品")
class 警察(): #
def 携带警犬工作(self,狗狗):
狗狗.工作()
# 创建对象,
老刘=警察()
小白=追踪犬()
大黑=缉毒犬()
# 调用不同的功能,传递不同的子类对象,观察执行结果
老刘.携带警犬工作 (小白)
老刘.携带警犬工作(大黑)
大黑.工作()
三 类属性和实例属性
[实例属性] 实例即对象
3.1 类属性
- 设置 访问 修改
3.1.1 设置和访问 类属性
-
类属性 就是类拥有的属性,它被该类所有实例对象所有共有
[代码]class Dog(): tooth=10 # 设置类属性
-
类属性可以使用 类或实例对象访问
[代码]print(Dog.tooth) # 直接用类 访问 大白=Dog() print(大白.tooth) # 创建对象,并用对象访问
类属性的优点
- 不变记录某项始终不变的数据 ,则定义类属性
- 节省空间 实例属性,每个对象占用一份内存空间, 类属性只要一份内存
3.1.2 修改类属性
注意 只能通过类修改,不能通过对象修改,对象修改的只是另外创建了一个实例属性
说人话
class Dog():
tooth=10
大白=Dog()
-
要修改 类属性 tooth=10
√ 只能用↓↓ 修改 类名.属性Dog.tooth=15
× 而不能 通过 通过对象修改类属性
大白.tooth=15
# --*coding:utf-8*--
"""
类属性的设置和访问
"""
# 1 创建类 ,并设置类属性
class Dog():
tooth=10 # 设置类属性
# 2 访问类属性
print(Dog.tooth) # (1)直接用类 访问
大白=Dog()
print(大白.tooth) # (2) 创建对象,并用对象访问
print("=========修改的分割线==========")
# 3 修改类属性
Dog.tooth=15 # 可以通过 直接修改类属性
大白.tooth=20 # 通过对象来修改类属性 ,无效
print(Dog.tooth) # 修改成功
print(大白.tooth) # 只是创建了一个 大白.tooth的对象,并没修改Dog.tooth
print(Dog.tooth)
10
10
=修改的分割线==
15
20
15
四 类方法和静态方法
4.1 类方法
4.1.1 类方法特点
- 需要用装饰器@classmethod来标识其为类方法,对于类方法,**第一个参数必须是类对象,**一般一cls作为第一个参数
[思考] 是不是可以理解, 类方法 就是把类的私有属性,return出去的方法, 那么 要有类 私有属性 要有return
4.1.2 类方法使用场景
- 访问 私有类属性时
- 类方法一般和类私有属性配合使用’
[代码]
# --*coding:utf-8*--
"""
[类方法 ]
[静态方法]
"""
# 1 定义类,设置私有属性,__
class Dog():
__tooth=10 # 私有类属性
age=5 # 类属性
# 2 类 方法来return这个属性
@classmethod
def get_tooth(cls):
return cls.__tooth
# 3 创建对象
小白=Dog()
print(小白.get_tooth()) # 私有类属性,要return出
print(Dog.age) # 普通类属性可以直接访问
4.2 静态方法
4.2.1 静态方法的特点
- 通过装饰器@staticmethod 来装饰,不能传递对象,没有形参self /cls
- 静态方法能够 通过 实例对象和类去 访问
4.2.2 使用场景
- 当方法中既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象(如类属性和方法\创建实例等)时, 定义静态方法
- 取消不需要的参数传递有利于减少不必要的内存占用和
# --*coding:utf-8*--
"""
[类方法 ]
[静态方法]
"""
# 1 定义类,设置私有属性,__
class Dog():
__tooth=10 # 私有类属性
age=5 # 类属性
# 2 类 方法来return这个属性
@classmethod
def get_tooth(cls):
return cls.__tooth
# 3 创建对象,调用类方法
小白=Dog()
print(小白.get_tooth()) # 私有类属性,要return出
print(Dog.age) # 普通类属性可以直接访问
# 4 静态方法
class Cat():
@staticmethod
def info():
print("静态方法,不可变? 固定")
# 5 创建对象
大黑=Cat()
# 6 用类访问 也可用对象访问
大黑.info() #静态方法,不可变? 固定
Cat.info() #静态方法,不可变? 固定
五 总结
声明 文字整理 B站视频 Python-七月 [Python 面向对象]
视频地址:
https://www.bilibili.com/video/BV1kT4y1971R?p=41