python编程Day12-属性和方法的分类

  • 私有和公有

在python中 定义类的时候,可以给 属性和方法设置 访问权限,即规定在什么地方可以使用。

权限一般分为两种:公有权限、私有权限

  • 公有权限
  • 定义:直接定义的属性和方法就是公有的
  • 特点: 可以在任何地方访问和使用,只要有对象就可以访问和使用。
  • 私有权限
  • 定义:
    1、只能在类内部定义(class 关键字的缩进中
    2、只需要在属性名 或者方法名 前边 加上两个下划线,这个方法或者属性就变成了私有的。
  • 特点:私有 只能在当前类的内部使用,不能在类外部和子类直接使用。
  • 应用场景:一般来说,定义的属性和方法都为公有的。 某个属性 不想在外部直接使用,定义为私有; 某个方法,是内部的方法(不想在外部使用),定义为私有。
bash 复制代码
"""定义人类,name 属性 ,age 属性(私有)"""
class Person:
    def __init__(self, name, age):     # 公有方法
        self.name = name    # 公有
        self.__age = age    # 公有 --> 私有,在属性名前加上两个下划线。

    def __str__(self):     # 公有方法
        return f'{self.name}, {self.__age}'

    def set_age(self, age):      # 定义公有方法,修改私有属性
        if age < 0 or age > 120:
            print('提供的年龄信息不对。')
            return
        self.__age = age


if __name__ == '__main__':
    xw = Person('小王', 18)
    print(xw)    # 小王, 18
    xw.__age = 1000    # 添加一个公有 属性 __age
    print(xw)   # 小王, 18
    xw.set_age(110)
    print(xw)    # 小王, 110
  • 对象分类

python 中一切皆对象

  • 对象分类

类对象 就是类

代码执行 的时候,解释器会自动创建

作用:

  • 1、使用类对象创建 实例对象
  • 2、存储一些类的特征值(类属性)
  • 实例对象

1、创建对象也称为实例化,所以 由类对象(类)创建的对象 称为是实例对象 ,简称实例。

2、一般来说,没有特殊强调,我们所说的对象 都是指 实例对象(实例)

3、实例对象也可以保存实例特征值(实例属性)

4、就是使用 类名()创建的对象。

  • 属性的划分

使用 实例对象.属性 访问属性 的时候,会先在 实例属性中查找,如果找不到,去类属性中查找,找到就使用,找不到就报错。
即 :每个实例对象 都有可能访问类属性值(前提,实例属性和类属性不重名。)

  • 实例属性
  • 概念:
    是每个实例对象 具有的特征(属性)。每个实例对象的特征
  • 定义:
    一般都是 在 init 方法中,使用 self.属性名 = 属性值 来定义。
  • 特征(内存):
    每个实例对象 都会保存自己的实例属性 ,即 内存中存在多份
  • 访问和修改:
    # 可以认为是通过 self
    实例对象.属性 = 属性值 # 修改
    实例对象.属性 # 访问
  • 类属性
  • 概念:
    是类对象具有的 特征,是整个类的特征
  • 定义:
    一般都是 在类的内部( class 缩进中),方法的外部 (def 的缩进外部) 定义的变量
  • 特征(内存):
    只有类对象 保存的一份,即在内存中只有一个。
  • 访问和修改:
    # 即通过类名
    类对象.属性 = 属性值
    类对象.属性
  • 什么时候定义类属性?

代码中 使用的属性 基本上都是 实例属性,即都通过 self 定义。

某个属性值 描述的信息是整个类的特征(这个值变动,所有的这个类的对象这个特征都会发生变化)

  • 案例
bash 复制代码
# 1. 定义一个 工具类
# 2. 每件工具都有自己的 name
# 3. 需求 ------ 知道使用这个类,创建了多少个工具对象?

class Tool:
    # 定义类属性 count,记录创建对象的个数
    count = 0
    def __init__(self, name):
        self.name = name    # 实例属性,工具的名字
        # 修改类属性的值
        Tool.count += 1  # 类名.属性 = 属性值


if __name__ == '__main__':
    # 查看 创建对象的个数
    print(Tool.count)  # 0 查看类.属性
    tool1 = Tool('锤子')
    print(Tool.count)  # 1
    tool2 = Tool('扳手')
    print(Tool.count)   # 2
    print(tool2.count)   # 2  先找实例属性 count,找不到,找类属性 count,找到 ,使用。
    
  • 方法的划分

  • 实例方法

  • 定义时机:
    如果方法中 需要使用 实例属性,则这个方法 必须 定义为 实例方法
  • 定义:
    直接定义的方法就是实例方法
bash 复制代码
class 类名:
	def 方法名(self):
		pass
  • 参数:
    参数一般写做 self,表示的是 实例对象。
  • 调用:
    实例对象.方法名()
  • 类方法
  • 定义时机:
    如果方法中 不需要使用 实例属性,但需要使用 类属性,则这个方法 可以 定义为 类方法(建议)
  • 定义:
    定义类方法,需要在方法名上方 书写 @classmethod, 即使用@classmethod 装饰器装饰
bash 复制代码
class 类名:
	@classmethod
	def 方法名(cls):
		pass
  • 参数:
    参数一般写做 cls ,表示类对象,即类名,同样不需要手动传递,Python 解释器会自动传递。
  • 调用:
    # 方法一
    类名.方法名()
    # 方法二
    实例对象.方法名()
  • 静态方法(了解)
  • 定义时机:
    方法中 既不需要 使用 实例属性,也不需要使用 类属性,可以将这个方法定义为 静态方法。
  • 定义:
    定义静态方法,需要使用 装饰器吧 @staticmethod 装饰方法。
bash 复制代码
class 类名:
	@staticmethod
	def 方法名():
		pass
  • 参数
    静态方法 一般对参数没有要求,一般不写
  • 调用:
    # 方法一
    类名.方法名()
    # 方法二
    实例对象.方法名()
  • 类方法实例
bash 复制代码
# 1. 定义一个 工具类
# 2. 每件工具都有自己的 name
# 3. 需求 ------ 知道使用这个类,创建了多少个工具对象?

class Tool:
    # 定义类属性 count,记录创建对象的个数
    count = 0
    def __init__(self, name):
        self.name = name    # 实例属性,工具的名字
        # 修改类属性的值
        Tool.count += 1  # 类名.属性 = 属性值

    @classmethod
    def show_tool_count(cls):   # cls 就是类对象,类名
        return cls.count



if __name__ == '__main__':
    # 查看 创建对象的个数
    print(Tool.show_tool_count())
    tool1 = Tool('锤子')
    print(Tool.show_tool_count())  # 通过类对象.方法名() 调用
    tool2 = Tool('扳手')
    print(tool2.show_tool_count())  # 通过实例对象.方法名()调用
  • 案例一
bash 复制代码
# 需求:
# 1. 设计一个 Game 类
# 2. 属性:
# • 定义一个 top_score 类属性 -> 记录游戏的历史最高分
# • 定义一个 player_name 实例属性 -> 记录当前游戏的玩家姓名
# 3. 方法:
# • 静态方法 show_help() -> 显示游戏帮助信息
# • 类方法 show_top_score() -> 显示历史最高分
# • 实例方法 start_game() -> 开始当前玩家的游戏
# - ① 使用随机数 生成 10-100 之间数字 作为本次游戏的得分
# - ② 打印本次游戏得分 : 玩家 xxx 本次游戏得分 ooo
# - ② 和历史最高分进行比较, 如果比历史最高分高, 修改历史最高分
# 4. 主程序步骤: main
# 1 查看帮助信息
# 2 查看历史最高分
# 3 创建游戏对象,开始游戏
# 4 再一次游戏
import random
class Game:
    """
    类名: Game
    属性:top_score = 0 类属性  ,保存历史最高分
        player_name 实例属性  定义在  init 中
    方法:
    """
    top_score = 0
    def __init__(self, play_name):
        self.play_name = play_name   # 实例属性

    # 静态方法
    @staticmethod
    def show_help():
        print('这是游戏的帮助信息')

    # 类方法
    @classmethod
    def show_top_score(cls):
        # 类方法 show_top_score() -> 显示历史最高分
        print(f'历史最高分为: {cls.top_score}')
        # return Game.top_score  # 类名.属性名

    def start_game(self):
        print(f'玩家{self.play_name}开始游戏')
        score = random.randint(10, 100)
        print(f'玩家 {self.play_name} 本次游戏得分 {score}')
        if score > Game.top_score:
            Game.top_score = score



if __name__ == '__main__':
    Game.show_help()
    Game.show_top_score()
    player = Game('小明')
    player.start_game()
    Game.show_top_score()
    player = Game('小明')
    player.start_game()
    Game.show_top_score()
相关推荐
Clown954 分钟前
go-zero(十八)结合Elasticsearch实现高效数据检索
开发语言·elasticsearch·golang
愚润求学4 分钟前
【Linux】动静态库的使用
linux·运维·服务器·开发语言·c++·笔记
写代码写到手抽筋14 分钟前
C++性能优化之访存优化(未完)
开发语言·c++
Dovis(誓平步青云)27 分钟前
基于面向对象设计的C++日期推算引擎:精准高效的时间运算实现与运算重载工程化实践
开发语言·c++·经验分享·笔记
HORSE RUNNING WILD30 分钟前
解决 PicGo 上传 GitHub图床及Marp中Github图片编译常见难题指南
css·python·github
夜晚中的人海40 分钟前
【C语言】初阶数据结构相关习题(二)
c语言·开发语言·数据结构
武昌库里写JAVA1 小时前
MacOS Python3安装
java·开发语言·spring boot·学习·课程设计
ElenaYu1 小时前
mac安装cast
python·macos·cast
Dxy12393102161 小时前
python如何设置excel单元格边框样式
开发语言·python·excel
chaodaibing1 小时前
Python解析Excel入库如何做到行的拆分
开发语言·python·excel