前言

前两篇文章讲了面向对象的概念、具体实现过程、还有继承、私有成员这些知识,我们简单的分析一下,面向对象的概念是程序员人人皆知的一种思想,实现过程呢是由一些【属性、私有属性】和【方法、私有方法】构成,这个对于面向对象来说有一个统称叫封装继承呢字面意思也很容易渗透,它在面向对象里面是子类继承父类的所有属性和方法,甚至可以重写父类属性和方法,其实,面向对象还有一个特点,它叫多态,具体什么意思呢,我们来讲讲。

一、面向对象三大特性

1. 封装:将【属性、私有属性】和【方法、私有方法】书写到类里面的操作。

2. 继承:子类继承父类的所有属性和方法,并且可以重写父类属性和方法。

3. 多态:传入不同的对象,产生不同的结果。


二、多态

2.1 特点

  1. 解释说明:多态是一种使用对象的方式,调用不同的子类对象传参到相同的父类方法,产生不同的执行结果。
  2. 优点
    • 增强了程序的灵活性
    • 增加了程序的可扩展性
    • 是调用方法的技巧,不会影响类的内部设计

2.2 应用

  1. 实现步骤
    • 定义父类,提供公共方法
    • 定义子类,重写父类方法
    • 传递子类对象给调用者,执行不同的结果
class Teacher():
    def work(self):
        print('开始讲课')

class FeTeacher(Teacher):
    def work(self):
        print('现在开始学习前端')

class PythonTeacher(Teacher):
    def work(self):
        print('现在开始学习Python')

class JavaTeacher(Teacher):
    def work(self):
        print('现在开始学习Java')

class School():
    def __init__(self,name):
        self.name = name
    def do_lession(self,teacher):
        teacher.work()

hr = School('清华大学')
t1 = FeTeacher()  # 创建前端老师对象
t2 = PythonTeacher() # 创建 Python 老师对象
t3 = JavaTeacher()  # 创建 Java 老师对象

hr.do_lession(t1) # 运行结果: 现在开始学习前端
hr.do_lession(t2) # 运行结果: 现在开始学习Python
hr.do_lession(t3) # 运行结果: 现在开始学习Java

三、类属性和实例属性

3.1 类属性

  • 说明
    • 类属性就是 类 所拥有的属性,它被 该类的所有实例对象 共有。
    • 类属性可以使用 类 或实例对象访问。
  • 优点
    • 记录数据始终保持一致时,定义类属性比较好。
    • 实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省内存空间。
  • 设置和访问类属性
class Country():
    country = '中国'  # 设置类属性

# 创建对象
c1 = Country()
print(c1.country)  # 中国
print(Country.country)  # 中国
  • 修改类属性

类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示创建了一个实例属性。

class Country():
    country = '中国'  # 类属性

c1 = Country()
Country.country = '韩国' # 修改类属性
print(Country.country)  # 韩国

# 通过实例对象修改类属性,实则类属性并没有变动
c1.country = '美国'
print(Country.country)  # 韩国
print(c1.country) # 美国

3.2 实例属性

class Country():
    def __init__(self):
        self.country = '中国'

# 创建对象
c1 = Country()
print(c1.country) # 中国

# 通过类对象访问实例属性报错,说明类对象不能访问实例属性
print(Country.country)  # 报错 AttributeError: type object 'Country' has no attribute 'country'

四、类方法和静态方法

4.1 类方法

  • 特点
    • 需要用装饰器@classmethod来标识其为类方法,第一个参数必须是类对象,一般以cls作为第一个参数
  • 应用场景
    • 当方法中需要使用类对象访问私有类属性时,定义类方法
    • 类方法一般与类属性配合使用
class Country():
    __country = '中国'  # 类属性

    # 类方法
    @classmethod
    def get_country(cls):
        return cls.__country

# 创建对象
c1 = Country()
print(c1.get_country()) # 中国

print(Country.get_country())  # 中国

4.2 静态方法

  • 特点
    • 需要用装饰器@staticmethod来标识,静态方法不需要传递类对象和实例对象(形参没有 slef 和 cls )。
    • 静态方法也能通过实例对象和类对象访问。
  • 应用场景
    • 当方法中既不需要使用实例对象、实例属性,也不需要使用类对象、类属性、类方法、创建实例等时,定义静态方法。
    • 取消不需要的参数传递,减少不必要的内存占用和性能消耗
class Country():

    # 静态方法
    @staticmethod
    def f1():
        print('我是静态方法')

# 创建对象
c1 = Country()
c1.f1() # 我是静态方法

Country.f1() # 我是静态方法

总结

每天进步一点点💥