目录
一、本章重点
-
类属性和类方法
-
私有属性和私有方法
-
静态方法
二、对象的分类
Python中的一切皆对象
1、类对象
(1)理解
-
类对象 就是 类,就是使用class定义的类
-
程序运行时,类会被加载到内存中
(2)作用
-
使用类对象创建实例对象:实例对象 = 类方法名()
-
存储一些类的特征值(类属性)
2、实例对象
(1)理解
-
创建对象也称为实例化,所以由 类对象(类) 创建的对象,称为实例对象,简称实例
-
一般来说,没有特殊强调所说的对象,都是实例对象(实例)
-
实例对象 可以保存实例的特征值(实例属性)
三、属性的划分
- 使用“实例对象.属性”访问属性的时候,会先在 实例属性中查找,找到就使用,找不到就去类属性中查找,还找不到就报错。
- 即:每个实例对象,都有可能访问类属性值(前提:实例属性和类属性不重名)
1、实例属性
(1)概念
-
实例属性是每个实例对象,具有的特征(属性),每个实例对象的特征
(2)定义
-
一般都是在init方法中,使用“self.属性名=属性值”来定义
(3)特征(内存)
-
每个实例对象,都会保存自己的实例属性,即内存中存在多分
(4)访问和修改
-
可以认为是通过self
-
实例对象.属性 = 属性值 #修改
-
实例对象.属性 #访问
-
2、类属性
(1)概念
-
类属性是类对象具有的特征,是整个类的特征
(2)定义
-
一般在类的内部(class缩进中),方法的外部(def的缩进外部)定义变量
(3)特征(内存)
-
只有类对象保存一份,即在内存中只有一个
(4)访问和修改
-
即通过类名
-
类对象.属性 = 属性值 #修改
-
类对象.属性 #访问
-
3、什么时候 定义类属性?
-
代码中使用的属性,基本上都是实例属性,即通过“self.属性名=属性值”定义
-
当某个属性值描述的信息,是整个类的特征(这个值变动,所有的这个类的实例对象的这个特征都会发生变化)
4、类属性案例
(1)需求
-
定义一个工具类
-
每件工具都有自己的name
-
需求---知道使用这个类,创建了多少个工具对象?
(2)示例代码
class Tool(object):
# 定义类属性count,记录创建工具对象的总数
count = 0
def __init__(self,name):
self.name = name #实例属性,工具的名字
# 修改类属性的值
Tool.count +=1
if __name__ == '__main__':
# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("铁锹")
# 查看使用Tool类到底创建了多少个对象?
print(f"现在创建了{Tool.count}个工具") #类对象.类属性名:查看类属性
print(tool2.count) #先找实例属性count,找不到,找类属性count,找到了,使用
'''
运行结果:
现在创建了3个工具
3
'''
四、方法的划分
1、实例方法
(1)定义时机
-
如果方法中 需要使用 实例属性,则这个方法“必须”定义为实例方法
(2)定义
-
在类中直接定义的方法,就是实例方法
![](https://i-blog.csdnimg.cn/blog_migrate/d3f7e6150661d0d42f77d021c03bd92e.png)
(3)参数
-
参数一般写作 self,表示的是实例对象
-
有疑惑请参考: 24 - 面向对象1_是李黏黏鸭的博客-CSDN博客的九.1
(4)调用
-
实例对象.方法名()
2、类方法
(1)定义时机
-
如果方法中 不需要使用 实例属性,但需要使用类属性,则这个方法“可以”定义为 类方法(建议)
(2)定义
-
定义类方法,需要在方法名上方书写@classmethod,即使用@classmethod装饰器修饰
![](https://i-blog.csdnimg.cn/blog_migrate/4e693a1ea158da24dbd639c6d354d808.png)
(3)参数
-
参数一般写作 cls,表示类对象,即 类名,不需要手动传递,Python解释器会自动传递
(4)调用
-
方法一:
-
类名.方法名
-
-
方法二:
-
实例对象.方法名()
-
-
在类方法内部
-
可以通过“cls.属性名”访问类的属性
-
也可以通过“cls.方法名()”调用其他的类方法
-
3、类方法案例
(1)需求
-
定义一个工具类
-
每件工具都有自己的name
-
需求---知道使用这个类,创建了多少个工具对象?
(2)示例代码
class Tool(object):
# 定义类属性,记录创建工具对象的总数
count = 0
def __init__(self,name):
self.name = name #实例属性,工具的名字
# 修改类属性的值
Tool.count +=1
@classmethod
def show_tool_count(cls): #cls:就是类对象,类名
'''显示工具对象总数'''
print(f'工具对象的总数={cls.count}')
# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("铁锹")
# 调用类方法
Tool.show_tool_count()
tool2.show_tool_count()
'''
运行结果:
工具对象的总数=3
工具对象的总数=3
'''
4、静态方法(了解)
(1)定义时机
-
方法中既 不需要 访问 实例属性 或者调用 实例方法,也 不需要 访问 类属性 或者调用 类方法,“可以”将这个方法定义为 静态方法
-
静态方法可以和函数一样传入参数使用
(2)定义
-
定义静态方法,需要使用装饰器 @staticmethod,装饰方法
![](https://i-blog.csdnimg.cn/blog_migrate/47db8cbb6ba86e68dc302b3154804977.png)
(3)参数
-
静态方法,对参数一般没有要求
(4)调用
-
方法一:类名.方法名()
-
方法二:实例对象.方法名()
5、方法综合案例
(1)需求
-
设计一个Game类
-
属性
-
定义一个top_score类属性 -> 记录游戏的历史最高分
-
定义一个player_name实例属性 -> 记录当前游戏的玩家姓名
-
-
方法
-
静态方法show_help() -> 显示游戏帮助信息
-
类方法show_top_score() -> 显示历史最高分
-
实例方法start_game() -> 开始当前玩家的游戏
-
-
主程序步骤
-
查看帮助信息
-
查看历史最高分
-
创建游戏对象,开始游戏
-
(2)示例代码
# 定义一个Game类
class Game:
# 定义类属性top_score,用于记录历史最高分
top_score = 0
def __init__(self, player_name):
# 定义一个示例属性player_name,用于记录玩家姓名
self.player_name = player_name
# 静态方法show_help() -> 显示游戏帮助信息
@staticmethod
def show_help():
print(f'游戏帮助信息')
# 类方法show_top_score() -> 显示历史最高分
@classmethod
def show_top_score(cls):
print(f'历史最高分{Game.top_score}')
# print(f'历史最高分是{cls.top_score}')
# 实例方法start_game() -> 开始当前玩家的游戏
def start_game(self):
print(f'开始当前玩家{self.player_name}的游戏')
if __name__ == '__main__':
# 1、查看帮助信息
Game.show_help()
# 2、查看历史最高分
Game.show_top_score()
# 3、创建游戏对象
palyer1 = Game('黏黏')
# 4、开始游戏
palyer1.start_game()
# 使用'类对象.属性名 = 属性值'类属性历史最高分
Game.top_score = 99
# 5、游戏结束,查看历史最高分
palyer1.show_top_score()
'''
运行结果:
游戏帮助信息
历史最高分0
开始当前玩家黏黏的游戏
历史最高分99
'''
五、类属性和类方法的应用场景
-
在后期的自动化测试过程中,在某些业务场景下,需要保证生成的对象始终只有一个时,就可以使用类对象及类属性和类方法。
-
优点:简化方法的调用步骤(无需实例化对象,直接通过“类名.方法名()”即可调用)。
六、私有属性和私有方法
- 在Python中,定义类的时候,可以给 属性和方法 设置访问权限,即规定在什么地方可以使用
- 权限一般分为两种:公有权限、私有权限
1、公有权限
(1)定义
-
直接定义的属性和方法就是公有的
(2)特点
-
可以在任何地方访问或使用,只要有对象就可以访问和使用
2、私有权限
(1)定义
-
当属性和方法只需要在类定义内部使用时, 就可以使用私有属性和私有方法
-
只能在类内部定义(class关键字缩进中)
-
只需要在 属性名 或方法名 ,前边加上两个下划线,这个方法或者属性就变为私有的
-
私有属性: __属性名
-
私有方法: __方法名()
-
(2)特点
-
只能在当前类内部使用
-
在类定义外部, 无论是通过类对象还是实例对象均无法获取私有属性和调用私有方法
-
在继承关系中, 父类中 的私有属性和私有方法, 子类 同样无法获取和调用
(3)应用场景
-
一般来说,定义的属性和方法都为公有的,某个属性不想在外部直接使用,定义为私有
-
某个方法,是内部的方法(不想在外部使用),定义为私有
(4)调用方式
-
在类定义内部,cls.__属性名/ cls.方法名()/self.__属性名/self.__方法名()
(5)私有属性和私有方法实例代码
class Women:
def __init__(self,name):
# 公有属性
self.name = name
# 私有属性
self.__age = 18
# 私有方法
def __secret(self):
# 在类内部,通过self.__私有属性名,访问私有属性
print(f'我的年龄是{self.__age}')
xiaofang = Women('小芳')
# 私有属性,在类外部不能直接访问
# print(xiaofang.__age)
# 私有方法,类外部不能直接调用
# xiaofang.__secret()