01. 类的结构

1.1 术语 – 实例

  1. 使用面向对象开发,第一步是设计类
  2. 使用类名()创建对象,创建对象的动作有两步
    ①在内存中为对象分配空间
    ②调用初始化方法__init__为对象初始化
  3. 对象创建后,内存中就有了一个对象的实实在在的存在 — 实例


因此,通常也会把:

  1. 创建出来的对象叫做类的实例
  2. 创建对象的动作叫做实例化
  3. 对象的属性叫做实例属性
  4. 对象调用的方法叫做实例方法

在执行程序时:

  1. 对象各自拥有自己的实例属性
  2. 调用对象的方法,可以通过self
    ①访问自己的属性
    ②调用自己的方法

结论:

  • 每一个对象都有自己独立的内存空间,保存自己各自不同的属性
  • 多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部

1.2 类是一个特殊的对象

Python中,一切皆对象
- class AAA: 定义的类属于类对象
- obj1 = AAA() 属于实例对象

  • 在程序运行时候,类同样会被加载到内存
  • 在Python中,类是一个特殊的对象–类对象
  • 在程序运行时,类对象在内存中只有一份,使用一个类可以创建出很多个对象实例
  • 除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法:类属性&类方法
  • 通过类名.的方式可以访问类的属性或者调用类 的方法

02. 类属性和实例属性

2.1 概念和使用

  • 类属性就是给类对象中定义的属性
  • 通常用来记录与这个类相关的特征
  • 类属性不会用于记录具体对象的特征

示例需求:

  • 定义一个工具类
  • 每件工具都有自己的name
  • 需求 ----知道使用这个类,创建了多少个工具对象
class Tool(object):count = 0def __init__(self, name):self.name = nameTool.count += 1tool1 = Tool("大刀")
tool2 = Tool("斧头")
tool3 = Tool("铲子")print(Tool.count)

运行结果:

2.2 属性获取机制

  • 在Python中,属性的获取存在一个向上查找机制

  • 因此,要访问类属性有两种方式:
    ①类名.类属性
    ②对象.类属性(不推荐)

**注意:**如果使用对象.类属性=值赋值语句,只会给对象添加一个属性,而不会影响类属性的值

class Tool(object):count = 0def __init__(self, name):self.name = nameTool.count += 1tool1 = Tool("大刀")
tool2 = Tool("斧头")
tool3 = Tool("铲子")tool3.count = 99
print("工具对象总数:%d" % tool3.count)
print(" ==== > %d " % Tool.count )

运行结果:

03. 类方法和静态方法

3.1 类方法

  • 类属性就是针对类对象定义的属性
    使用赋值语句在class关键字下方可以定义类属性
    类属性用于记录与这个类相关的特征
  • 类方法就是针对类对象的方法
    在类方法内部可以直接访问类属性或者调用其他类方法

语法:

@classmethod
def 类方法名(cls):pass
  • 类方法需要修饰器@classmethod来标识,告诉解释器这是一个类方法
  • 类方法的第一个参数应该是cls
    ①由哪一个类调用的方法,方法内的cls就是哪一个类的引用
    ②这个参数和实例方法的第一个参数是self类似
    提示使用其他名称也可以,不过习惯使用cls
  • 通过类名.调用类方法,调用方法时,不需要传递cls参数
  • 在方法内部
    ①可以通过cls.访问类的属性
    ②可以通过cls.调用其他类方法

示例需求

  • 定义一个工具类
  • 每件工具都有自己的name
  • 需求-----在类封装一个show_tool_count的类方法,输出使用当前这个类,创建的对象的个数
class Tool(object):count = 0def __init__(self, name):self.name = nameTool.count += 1@classmethoddef show_tool_count(cls):print("当前共有 %d 件工具" % cls.count)tool1 = Tool("刀")
tool2 = Tool("斧")
tool3 = Tool("叉")Tool.show_tool_count()

运行结果:

3.2 静态方法

  • 在开发时,如果需要在类中封装一个方法,这个方法
    ①既不需要访问实例属性或者调用实例方法
    ②呀不需要访问类属性或者调用类方法
  • 这个时候,可以把这个方法封装成一个静态方法

语法:

@staticmethod
def 静态方法名():pass
  • 静态方法需要用修饰器@staticmethod来标识,告诉解释器这是一个静态方法
  • 通过类名.调用静态方法
class Dog(object):@staticmethoddef run():print("跑")@staticmethoddef eat():print("吃")Dog.eat()
Dog.run()

运行结果:

3.3 方法综合案例

需求

  1. 设计一个Game类
  2. 属性:
    ①定义一个类属性top_score记录游戏的历史最高分
    ②定义一个实例属性player_name记录当前游戏的玩家姓名
  3. 方法:
    ①静态方法show_help显示游戏帮助信息
    ②类方法show_top_score显示历史最高分
    ③实例方法start_game开始当前玩家的游戏
  4. 主程序步骤
    Ⅰ. 查看帮助信息
    Ⅱ. 查看历史最高分
    Ⅲ. 创建游戏对象,开始游戏

class Game(object):# 定义类属性 直接在class下面定义top_score = 0# 定义实例属性 应该在类的初始化之中定义def __init__(self, player_name):self.player_name = player_name# 定义静态方法@staticmethoddef show_help():print("游戏帮助")# 定义类方法@classmethoddef show_top_score(cls):print("历史最高分:%d" % cls.top_score)# 定义实例方法def start_game(self):print("%s 开始游戏" % self.player_name)# 查看游戏帮助信息
Game.show_help()
# 查看历史最高分
Game.show_top_score()
# 创建游戏对象,开始游戏
game = Game("KaISarH")
game.start_game()

运行结果:

案例小结

  1. 实例方法----方法内部需要访问实例属性
    实例方法内部可以使用类名.访问类属性
  2. 类方法—方法内部只需要访问类属性
  3. 静态方法—内部方法,不需要访问实例属性和类属性

当我们需要访问类属性和实例属性的时候,要定义成实例方法.
通过类名.访问类属性

面向对象(Python):学习笔记之类属性和类方法相关推荐

  1. Python学习笔记(十九)面向对象 - 继承

    Python学习笔记(十九)面向对象 - 继承 一.继承的概念 # 继承:子类继承父类的所有方法和属性# 1. 子类 class A(object):def __init__(self):self.n ...

  2. Python学习笔记:Day 3编写ORM

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. Python学习笔记(5)

    Python学习笔记(5) 文章目录 前言 一.类与对象 1.类的创建 2.类的组成 3.对象的创建 4.类的调用 5.类属性和类方法 二.类的封装.继承和多态 1.封装 2.继承 3.object类 ...

  4. Python学习笔记:第十三站 接着找对象

    Python学习笔记 文章目录 Python学习笔记 第十三站 接着找对象 1. 封装 2. 继承 3. 方法重写 4. object类 5. 多态 6. 特殊方法和特殊属性 7. 类的赋值与拷贝 8 ...

  5. python学习笔记,初学者Python3

    Python学习笔记 不推荐将python作为主力语言,但推荐作为一个辅助语言,用于日常的一些小的任务 python目前主要的应用场景: 1.机器学习,人工智能 2.爬虫 3.数据分析 4.自动化,运 ...

  6. Python学习笔记 day5

    Python学习笔记 day5 参考/引用资料: 1.file a.打开文件方式(读写两种方式) 缓冲 with语句 b.文件对象的操作方法 c.学习对excel及csv文件进行操作 读写excel ...

  7. python学习笔记02

    python学习笔记02 面向对象Object Oriented 概述 类和对象 封装 继承 多态 类与类的关系 设计原则 总结 python学习笔记03 面向对象Object Oriented 概述 ...

  8. OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并

    OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...

  9. Python学习笔记:Day 12 编写日志列表页

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此, 写下这些 ...

  10. Python学习笔记:Day11 编写日志创建页

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. 【java 性能优化实战】2 深入剖析:哪些资源,容易成为瓶颈
  2. hdfs入门——常用命令
  3. php读取excel文件_php读取EXCEL文件 php excelreader读取excel文件
  4. JS基础入门篇(四十三)—ES6(二)
  5. 菜鸟涂鸦作品展_No.27
  6. LVS负载均衡-NAT模式
  7. [html] HTML5中的article和section有什么区别?
  8. java resultset查询_java – 什么是“查询返回多个ResultSet”的解决方案
  9. Orchard核心机制
  10. Swagger 3.0 官方 starter 诞生,野生的可以扔了!
  11. mysql sql执行慢_Mysql执行查询语句慢的解决方式
  12. 【C语言】指针(野指针)
  13. 高中计算机会考操作试题,高中信息技术会考(上机操作题要点)
  14. oracle ssd加速,使用Oracle的SSD
  15. matlab matconvnet
  16. 我有一个还在蹒跚学步的小孩是否应该学习Python?
  17. 2018医学考博英语阅读理解解题技巧
  18. 0基础学绘画怎么临摹
  19. 分析中国古建筑最大的特点
  20. 二分类神经网络结果准确率50%,loss一直在0.69的解决方法

热门文章

  1. 5.文件操作 --- 系统调用
  2. 17. meta http-equiv 属性
  3. 6. Zend_Uri
  4. 5. MVC,MVP 和 MVVM
  5. 35. Element title 属性
  6. 2. laravel 创建第一条路由
  7. 循序渐进之Spring AOP(6) - 使用@Aspect注解
  8. 从后台servlet中,获取jsp页面输入的值,来删除用户一行信息
  9. Python心得基础篇【7】面向对象进阶篇
  10. Effective Java Methods Common to All Objects