对象属性和类属性
--掌握--对象属性
==目标==掌握对象属性的使用
对象属性,有时也称实例属性、普通属性、公有属性 、或者直接叫属性
在类内部,访问对象属性语法:
self.对象属性名
在类外部,访问对象属性语法:
对象名.对象属性名
例如:
(1)定义一个手机类,属性有品牌、颜色;
(2)分别试着在类内部和类外部访问属性。
# 1.定义手机类
# 2.内部访问
class Phone(object):
def __init__(self,color,brand): # 构造器
# 对象名.属性名
self.color = color # 对象属性
self.brand = brand # 对象属性
def show(self):
print(f"访问车的颜色:{self.color}")
# 3.外部访问
phone = Phone("黑色","Audi")
print(f"颜色:{phone.color}")
print(f"品牌:{phone.brand}")
==总结:==
(1)在类外部要访问对象属性,语法:( A ).属性名;==A、对象名==;B、类名;
(2)在类内部要访问对象属性,语法:self.属性名。
--了解--类属性
==目标==了解类属性的简单使用
类属性指的是:类所拥有的属性,在整个类中都可以直接使用
定义类属性语法:
class 类名(object):
类属性名 = 值
调用类属性语法:
类名.类属性名
例如,一起来完成:
(1)在Student类中,定义一个名为school_name的类属性;
(2)调用使用类属性,观察效果。
class Student: # 公共属性就定义成类属性
school_name = '黑马程序员' #类属性,所有对象共享,不输入任何一个对象,属于整个类,用类名访问,用对象访问可以可以
# 属性
def __init__(self, id,name, age,sex):
self.id = id # 对象属性,属于某个对象的,使用对象访问
self.name = name
self.age = age
self.sex = sex
# 学习行为
def study(self):
print(f'{self.name}学生要好好学习!')
# 睡觉行为
def sleep(self):
print(f'{self.name}学生要好好睡觉!')
print('-----------------------')
stu = Student(1001,'刘备',18,'M')
# 访问类属性
print('-----------访问类属性-----------------')
print(Student.school_name) # 使用类名来访问类属性
print(stu.school_name) # 类属性也可以使用对象访问,但是不建议
# 访问对象属性
print('-----------访问对象属性-----------------')
print(stu.id) # 使用对象来访问对象属性
print(stu.name) # 使用对象来访问对象属性
print(stu.age) # 使用对象来访问对象属性
print(stu.sex) # 使用对象来访问对象属性# 1.定义类 -类属性 [方法]
class People(object):
# 类属性
count = 100
def show(self):
print("森林防火,人人有责.")
# 2.调用使用
# print(People.count)
# 扩展 了解
# p = People()
# print(p.count)
# 思考: 类属性名可以私有化吗?如何访问?
==总结:==
(1)实际上,可以通过对象名和类名来调用类属性,但优先考虑使用【().类属性名】形式。==A、类名==;B、对象名;
类方法和静态方法
--了解--类方法
==目标==了解类方法的简单使用
类方法指的是:类所拥有的方法。要形成类方法,需满足:
(1)使用装饰器@classmethod来修饰方法;
(2)把方法的第1个参数设置为cls。
定义类方法,语法:
class 类名(object):
@classmethod
def 类方法名(cls):
...
# 类方法中不能出现self
调用类方法,语法:
类名.类方法名()
说明:类方法一般会和类属性配合使用,尤其是私有类属性。
例如,一起来完成:
(1)定义一个小狗类,且小狗很喜欢吃骨头;[类方法]
# 1、定义类方法
class Dog(object):
total_dogs = 10 # 类属性,类变量
@classmethod # 类方法
def eat(cls):
print(f'{cls.total_dogs}条狗吃骨头') # cls就代表类本身 ,使用类方法来访问类属性
# 调用类方法
Dog.eat() # 直接使用类名来访问类方法
# 静态方法中不能出现self
==总结:==
(1)定义类方法时,需要:先使用()修饰方法,且第1个参数名为cls;==A、@classmethod==;B、@method;
(2)调用类方法的语法:类名.类方法名()。
--了解--静态方法
==目标:==了解静态方法的简单使用。
静态方法需要通过装饰器@staticmethod来修饰方法,且静态方法一般不需要定义任何参数。
定义静态方法,语法:
class 类名(object): @staticmethod def 静态方法名(): ...
调用静态方法,语法:
类名.静态方法名()
说明:可以使用静态方法显示一些文本信息。
在Python中,静态方法(static method)是类中的一个方法,但它既不属于类本身(如类方法),也不属于类的实例。静态方法不需要特定的类实例来调用,也不需要类本身作为第一个参数(如类方法中的cls
)。它们基本上就是定义在类命名空间中的普通函数,只不过这些函数可以通过类名或类的实例名来调用。
例如,一起来完成:
(1)开发一款要显示操作界面的小游戏,分别有开始、暂停、退出等按键;
(2)使用静态方法完成编写。
# 1.定义类
# 2.静态方法
class Game(object):
@staticmethod
def show_menu():
print("==================================")
print("\t1.开始游戏;")
print("\t2.暂停游戏;")
print("\t3.结束游戏.")
print("==================================")
# 静态方法
Game.show_menu() # 通过类名来调用静态方法
game = Game()
game.show_menu() # 通过实例对象调用静态方法
==总结:==
(1)请问:静态方法要使用@staticmethod修饰,且可以没有参数,这句话正确吗?==A、正确==;B、不正确;
(2)调用静态方法的语法:类名.静态方法名()。
扩展综合案例
1. 设计一个 Game 类 (类名)
2. 属性:
• 定义一个 top_score 类属性 -> 记录游戏的历史最高分
• 定义一个 player_name 实例属性 -> 记录当前游戏的玩家姓名
3. 方法:
• 静态方法 show_help() -> 直接打印 这是游戏帮助信息
• 类方法 show_top_score() -> 显示历史最高分
• 实例方法 start_game() -> 开始当前玩家的游戏
- 3.1 输出 玩家 xxx 开始游戏
- 3.2 使用随机数,生成 10 - 100 之间的随机数字作为本次游戏的得分
- 3.3 打印 玩家 xxx 本次游戏得分 xxx
- 3.4 判断本次游戏得分和最高分之间的关系
4. 主程序步骤: __main__
1 查看帮助信息
2 查看历史最高分
3 创建游戏对象,开始游戏
import random
class Game(object):
top_score = 0 # 类属性:记录游戏的历史最高分
def __init__(self,name):
self.name = name #记录当前游戏的玩家姓名
#这是游戏帮助信息
@staticmethod
def show_help():
print("==================================")
print("\t1.开始游戏;")
print("\t2.暂停游戏;")
print("\t3.结束游戏.")
print("==================================")
#显示历史最高分
@classmethod
def show_top_score(cls):
print(f'当前历史最高分{cls.top_score}') # 类方法访问类属性
# 开始当前玩家的游戏
def start_game(self):
# 3.1 输出 玩家 xxx 开始游戏
print(f'玩家{self.name} 开始游戏')
#3.2 使用随机数,生成 10 - 100 之间的随机数字作为本次游戏的得分
score = random.randint(10, 100)
#3.3 打印 玩家 xxx 本次游戏得分 xxx
print(f'玩家 {self.name} 本次游戏得分 {score}')
#3.4 判断本次游戏得分和最高分之间的关系
if score > Game.top_score:
print(f'恭喜{self.name}打破了最高纪录!')
Game.top_score = score # 修改最高分
else:
print(f'很遗憾,{self.name}没有打破了最高纪录,继续努力!')
if __name__ == '__main__':
print('-----------------------------------------')
#1 查看帮助信息
Game.show_help()
#2 查看历史最高分
Game.show_top_score()
#3 创建游戏对象,开始游戏
game = Game('刘备')
game.start_game()
print('-----------------------------------------')
#1 查看帮助信息
Game.show_help()
#2 查看历史最高分
Game.show_top_score()
#3 创建游戏对象,开始游戏
game = Game('关羽')
game.start_game()