Python面向对象 (三) 多态及其他

目标

  • 面向对象的三大特性
  • 类属性和实例属性
  • 类方法和静态方法

一 面向对象的三大特性

  • 封装
    – 将属性和方法书写到类的里面的操作即为封装
    – 封装可以为属性和方法添加私有权限
  • 继承
    – 子类默认继承父类的所有属性和方法
    – 子类重写(覆盖)调用父类的属性和方法
  • 多态
    – 传入不同的对象,产生不同的结果

二 多态

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值