19_python基础—面向对象-类结构、类属性和类方法、静态方法

简介: 19_python基础—面向对象-类结构、类属性和类方法、静态方法

一、面向对象三大特性


封装


将属性和方法书写到类的里面的操作即为封装

封装可以为属性和方法添加私有权限


继承 (实现代码的重用,相同的代码不需要重复的编写)


子类默认继承父类的所有属性和方法

子类可以重写父类属性和方法


多态


不同的 子类对象 调用相同的 父类方法,产生不同的执行结果

传入不同的对象,产生不同的结果


二、类结构


2.1 术语—实例


使用面相对象开发,第 1 步 是设计 类

使用 类名() 创建对象,创建对象 的动作有两步:

在内存中为对象 分配空间

调用初始化方法 __init__ 为 对象初始化


3.对象创建后,内存 中就有了一个对象的 实实在在 的存在 —— 实例


b439044f73e04c7db3ef1a8f1c7092cb.png


因此,通常也会把:


创建出来的 对象 叫做 类 的 实例

创建对象的 动作 叫做 实例化

对象的属性 叫做 实例属性

对象调用的方法 叫做 实例方法


在程序执行时:


对象各自拥有自己的 实例属性

调用对象方法,可以通过 self.

访问自己的属性

调用自己的方法


结论


每一个对象 都有自己 独立的内存空间,保存各自不同的属性

多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用 传递到方法内部


2.2 类是一个特殊的对象


Python 中 一切皆对象:


class A: 定义的类属于 类对象

obj = A() 属于 实例对象

在程序运行时,类 同样 会被加载到内存


在 Python 中,类 是一个特殊的对象 —— 类对象


在程序运行时,类对象 在内存中 只有一份,使用 一个类 可以创建出 很多个对象实例


除了封装 实例 的 属性 和 方法外,类对象 还可以拥有自己的 属性 和 方法


类属性

类方法


通过 类名. 的方式可以 访问类的属性 或者 调用类的方法


82afb81b15909cfec205a026a564a8a9.png


三、类属性和实例属性


3.1 类属性(两种访问方式)


类属性 就是给 类对象 中定义的 属性

通常用来记录 与这个类相关 的特征

类属性 不会用于记录 具体对象的特征


3.1.1 设置和访问类属性


1)设置类属性


类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有。


属性 = 值


2)访问类属性


类属性可以使用 类对象 或 实例对象 访问。


类名.类属性


对象.类属性 (不推荐)


注意


  • 如果使用 对象.类属性 = 值 赋值语句,只会 给对象添加一个属性,而不会影响到 类属性的
# 1. 定义类,定义类属性
class Dog(object):
    tooth = 10   # 设置类属性
# 2. 创建对象
wangcai = Dog()
xiaohei = Dog()
# 3. 访问类属性(两种方法): 类和对象
print(Dog.tooth)  # 10
print(wangcai.tooth)  # 10
print(xiaohei.tooth)  # 10


类属性的优点


记录的某项数据 始终保持一致时,则定义类属性。


实例属性 要求 每个对象 为其 单独开辟一份内存空间 来记录数据,而 类属性 为全类所共有 ,仅占用一份内存,更加节省内存空间。


3.1.2 修改类属性(一种修改方式)


类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。


在类外部修改类属性


类名.类属性 = 值     # 修改类属性

class Dog(object):
    tooth = 10
wangcai = Dog()
xiaohei = Dog()
# 修改类属性
Dog.tooth = 12
print(Dog.tooth)  # 12
print(wangcai.tooth)  # 12
print(xiaohei.tooth)  # 12
# 不能通过对象修改属性,如果这样操作,实则是创建了一个实例属性
wangcai.tooth = 20
print(Dog.tooth)  # 12
print(wangcai.tooth)  # 20
print(xiaohei.tooth)  # 12


3.2 实例属性


实例属性:描述事物的特征。

class Dog(object):
    def __init__(self):
        self.age = 5
    def info_print(self):
        print(self.age)
wangcai = Dog()
print(wangcai.age)  # 5
# print(Dog.age)  # 报错:实例属性不能通过类访问
wangcai.info_print()  # 5

四、类方法和静态方法


4.1 类方法(两种访问方式)


4.1.1 类方法语法


  • 类方法就是针对类对象定义的方法
  • 类方法 内部可以直接访问 类属性 或者调用其他的 类方法


语法如下


@classmethod
def 类方法名(cls):
    pass


类方法需要用 修饰器 @classmethod 来标识,告诉解释器这是一个类方法

类方法的 第一个参数 应该是 cls

由 哪一个类 调用的方法,方法内的 cls 就是 哪一个类的引用

这个参数和 实例方法 的第一个参数是 self 类似

提示 使用其他名称也可以,不过习惯使用 cls


4.1.2 类方法特点


需要用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数。


在方法内部


可以通过 cls. 访问类的属性

也可以通过 cls. 调用其他的类方法


4.1.3 类方法使用场景


当方法中 需要使用类对象 (如访问私有类属性等)时,定义类方法


类方法一般和类属性配合使用


调用类方法(两种)


类名.类方法()   # 不需要传递 cls 参数


对象名.类方法()

# 1. 定义类:私有类属性,类方法获取这个私有类属性
class Dog(object):
    __tooth = 10  # 定义私有类属性
    # 定义类方法
    @classmethod
    def get_tooth(cls):  # cls指代Dog这个类
        return cls.__tooth
# 2. 创建对象,调用类方法
wangcai = Dog()
result = wangcai.get_tooth()
print(result)  # 10
result = Dog.get_tooth()
print(result)  # 10 


4.2 静态方法(两种访问方式)


4.2.1 静态方法语法


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


语法如下


@staticmethod
def 静态方法名():
    pass


静态方法 需要用 修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法

通过 类名. 调用 静态方法


4.2.2 静态方法特点


需要通过装饰器@staticmethod来进行修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)。


静态方法 也能够通过 实例对象 和 类对象 去访问。


类名.静态方法名()


对象名.静态方法名()


4.2.3 静态方法使用场景


  • 当方法中 既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象 (如类属性、类方法、创建实例等)时,定义静态方法


  • 取消不需要的参数传递,有利于 减少不必要的内存占用和性能消耗
# 1. 定义类,定义静态方法
class Dog(object):
    @staticmethod
    def info_print():
        print('这是一个静态方法')
# 2. 创建对象
wangcai = Dog()
# 3. 调用静态方法:类 和 对象
wangcai.info_print()   # 这是一个静态方法
Dog.info_print()       # 这是一个静态方法


五、总结


  • 面向对象三大特性
  • 封装
  • 继承
  • 多态
  • 类属性
  • 归属于类对象的属性,所有对象共有的属性
  • 实例属性
  • 类方法
@classmethod
def xx():
  代码
  • 静态方法


@staticmethod
def xx():
  代码


目录
相关文章
|
17天前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
71 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
28天前
|
物联网 Python
请问:如何使用python对物联网平台上设备的属性进行更改?
为验证项目可行性,本实验利用阿里云物联网平台创建设备并定义电流、电压两个整型属性。通过Python与平台交互,实现对设备属性的控制,确保后续项目的顺利进行。此过程涵盖设备连接、数据传输及属性调控等功能。
|
2月前
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
40 2
|
2月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
3月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
103 8
|
3月前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
在 Python 编程中,图是一种重要的数据结构,而深度优先搜索(DFS)和广度优先搜索(BFS)是遍历图的两种关键算法。本文将通过定义图的数据结构、实现 DFS 和 BFS 算法,并通过具体示例展示其应用,帮助读者深入理解这两种算法。DFS 适用于寻找路径和检查图连通性,而 BFS 适用于寻找最短路径。掌握这些技巧,可以更高效地解决与图相关的复杂问题。
40 2
|
3月前
|
Python
SciPy 教程 之 SciPy 图结构 7
《SciPy 教程 之 SciPy 图结构 7》介绍了 SciPy 中处理图结构的方法。图是由节点和边组成的集合,用于表示对象及其之间的关系。scipy.sparse.csgraph 模块提供了多种图处理功能,如 `breadth_first_order()` 方法可按广度优先顺序遍历图。示例代码展示了如何使用该方法从给定的邻接矩阵中获取广度优先遍历的顺序。
40 2
|
3月前
|
算法 Python
SciPy 教程 之 SciPy 图结构 5
SciPy 图结构教程,介绍图的基本概念和SciPy中处理图结构的模块scipy.sparse.csgraph。重点讲解贝尔曼-福特算法,用于求解任意两点间最短路径,支持有向图和负权边。通过示例演示如何使用bellman_ford()方法计算最短路径。
39 3
|
3月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
65 3
|
4月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
41 1