Python学习笔记—— 面向对象4.类属性、类方法、静态方法
一、类属性
术语-------实例
① 使用面向对象开发,第一步是设计类
② 使用类名()创建对象,创建对象的动作有两步:
· 在内存中为对象分配空间
· 调用初始化方法__init__为对象初始化
③ 对象创建后,内存中就有了对象的实实在在的存在----实例
因此,通常也会把:
· 创建出来的对象叫做类的实例
· 创建对象的动作叫做实例化
· 对象的属性叫做实例属性
类是一个特殊的对象
Python 中一切皆对象:
· class AAA: 定义的类属于类对象
· obj1 = AAA()属于实例对象
· 在程序运行时,类同样会被加载到内存
· 在Python中,类是一个特殊的对象 ----类对象
· 在程序运行时,类对象在内存中只有一份,使用一个类在对象中可以创建出多个对象实例
· 除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法
· 通过类名.的方式可以访问类的属性或者调用类的方法
类属性的定义和使用
· 类属性就是给类对象中定义的属性
· 通常用来记录与这个类相关的特征
· 类属性不会用于记录具体对象的特征
class Tool(object):
#使用赋值语句,定义类属性,记录创建工具对象的总数
count = 0
def __init__(self,name):
self.name = name
#针对类属性做一个计数+1
Tool.count +=1
#创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("铁楸")
print(Tool.count)
3
二、类方法
类方法就是针对类对象定义的方法
· 在类方法内部可以直接访问类属性或者调用其他的类方法
语法如下:
@classmethod
def 类方法名(cls):
pass
· 类方法需要用修饰器@classmethod来标识,告诉解释器这是一个类方法
· 类方法的第一个参数应该是cls
→由那一个类调用的方法,方法内的cls就是哪一个类的引用,与self类似
实例:
class Tool(object):
#使用赋值语句,定义类属性,记录创建工具对象的总数
count = 0
def __init__(self,name):
self.name = name
#针对类属性做一个计数+1
Tool.count +=1
@classmethod
def show_tool_count(cls):
print("工具对象总数 %d"%cls.count)
#创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("铁楸")
Tool.show_tool_count()
工具对象总数 3
三、静态方法
在开发时,如果需要再类中封装一个方法,这个方法:
· 既不需要访问实例属性和实力方法
· 也不需要访问类属性和类方法
这个时候可以把方法封装成一个静态方法
语法如下:
@staticmethod
def 静态方法名():
pass
不需要用self作为第一个参数
示例:
class Dog(object):
@staticmethod
def run():
print("小狗要跑...")
Dog.run()
小狗要跑…
四、综合实例
class Game(object):
# 历史最高分
top_score = 0
def __init__(self, player_name):
self.player_name = player_name
@staticmethod
def show_help():
print("帮助信息:让僵尸进入大门")
@classmethod
def show_top_score(cls):
print("历史最高分是 %d" % cls.top_score)
def start_game(self):
print("%s 开始游戏啦..." % self.player_name)
def score(self, score):
print("本次得分为%d"%score)
if score >= Game.top_score:
Game.top_score = score
# 1.查看游戏的帮助信息
Game.show_help()
# 2.查看历史最高分
Game.show_top_score()
# 3.创建游戏对象
game = Game("小明")
game.start_game()
game.score(100)
game.show_top_score()
game.score(50)
game.score(150)
game.show_top_score()
帮助信息:让僵尸进入大门
历史最高分是 0
小明 开始游戏啦…
本次得分为100
历史最高分是 100
本次得分为50
本次得分为150
历史最高分是 150