文章目录(PS:觉得不错请点赞收藏支持一下)
前言
前两篇文章讲了面向对象的概念、具体实现过程、还有继承、私有成员这些知识,我们简单的分析一下,面向对象的概念是程序员人人皆知的一种思想,实现过程呢是由一些【属性、私有属性】和【方法、私有方法】构成,这个对于面向对象来说有一个统称叫封装,继承呢字面意思也很容易渗透,它在面向对象里面是子类继承父类的所有属性和方法,甚至可以重写父类属性和方法,其实,面向对象还有一个特点,它叫多态,具体什么意思呢,我们来讲讲。
一、面向对象三大特性
1. 封装:将【属性、私有属性】和【方法、私有方法】书写到类里面的操作。
2. 继承:子类继承父类的所有属性和方法,并且可以重写父类属性和方法。
3. 多态:传入不同的对象,产生不同的结果。
二、多态
2.1 特点
- 解释说明:多态是一种使用对象的方式,调用不同的子类对象传参到相同的父类方法,产生不同的执行结果。
- 优点
- 增强了程序的灵活性
- 增加了程序的可扩展性
- 是调用方法的技巧,不会影响类的内部设计
2.2 应用
- 实现步骤
- 定义父类,提供公共方法
- 定义子类,重写父类方法
- 传递子类对象给调用者,执行不同的结果
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() # 我是静态方法
总结
每天进步一点点💥