万物皆对象之Python中类的概念

文章目录


1、面向对象基本概念

1.1 万物皆对象

  • Python语言的中所有数据类型都是对象、函数是对象、模块是对象
  • Python所有类都是继承最基础的类object
  • Python语言中的数据类型的操作功能都是类方法的体现

1.2 面向对象编程

面向对象编程又叫OOP(Object-Oriented-Programming)

OOP:面向对象编程,一种编程思想,重点在于高抽象的复用代码

  • OOP把对象当做程序的基本单元,对象包含数据和操作数据的函数
  • OOP本质是把问题解决抽象为以对象为中心的计算机程序
  • OOP在较大规模或复杂项目中十分有用,OOP可以提高协作产量
  • OOP最主要的价值在于代码复用
  • OOP仅仅是一个编程方式,并非解决问题的高级方法

面向过程与面向对象的区别

面向过程以解决问题的过程步骤为核心编写程序的方式,面向对象以问题对象构建和应用为核心编写程序的方式,所有能用OOP解决的问题,面向过程都能解决。

1.3 面向对象的特征

**封装(Encapsulation) :**属性和方法的抽象,用数据和操作数据的方法来形成对象逻辑

方法的抽象:对类的属性(变量)进行定义、隔离和保护

  • **对象的抽象:**对类的方法(函数)进行定义、隔离和保护
  • 目标是形成一个类对外可操作属性和方法的接口

**继承:**代码复用的高级抽象,用对象之间的继承关系来形成代码复用

继承是面向对象程序设计的精髓之一

  • 实现了以类为单位的高抽象级别的代码复用
  • 继承是新定义类能够几乎完全使用原有类属性与方法的过程

**多态:**方法灵活性的抽象,让对象的操作更加灵活、更多复用代码

参数类型的多态:一个方法能够处理多个类型的能力

  • **参数形式的多态:**一个方法能够接受多个参数的能力
  • 多态是OOP的一个传统概念,Python天然支持多态,不需要特殊语法

2、Python面向对象的术语

类(Class)和对象(Object)

  • **类:**逻辑抽象和产生对象的模板,一组变量和函数的特定编排
  • **对象:**具体表达数据及操作的实体,相当于程序中的"变量"。包括:类对象、实例对象

类定义完成后,默认生成一个类对象,每个类唯一对应一个类对象,用于存储这个累的基本信息 类对象是type的实例,表达为type类型;

  • 实例对象(Instance Object): Python类实例后产生的对象,简称:对象
  • 类对象全局只有一个,实例对象可以生成多个

**属性:**存储数据的"变量"(就是定义在类中的变量),用来描述类的一些特性参数。包括:类属性、实例属性

  • **类属性(Class Attribute):**类对象的属性,由所有实例对象共享;类内定义,在__init__函数外面。一般是类所共有的属性定义为类属性。
  • **实例属性(Instance Attribute):**实例对象的属性,一般在类中的函数中定义,实例属性可能为某个实例独有。

**方法:**操作数据的"方法"(就是定义在类中的变量),用来给出类的操作功能。包括:类方法、实例方法、自由方法、静态方法、保留方法

  • **类方法(Class Method):**类对象的方法,由所有实例对象共享
  • **实例方法(Instance Method):**实例对象的方法,由各实例对象独享,最常用的形式、
  • **自由方法(Namespace Method):**类中的一个普通函数,由类所在命名空间管理,类对象独享
  • **静态方法(Static Method):**类中的一个普通函数,由对象和实例对象共享
  • 保留方法(Reserved Method):有双下划线喀什和结束的方法,保留使用。

**实例化:**从类到对象的过程,所有"对象"都源于某个"类"

3、Python类的构建

3.1 类的基本构建

在Python中,使用class关键字加上类名来定义类,通过缩进我们可以确定类的代码块,就如同定义函数那样。语法结构

复制代码
class <类名>:
    \[类描述"documentation string"\]
    <语句块>

因为Python是脚本语言,定义类不限制位置,可以包含在分支或其他从属语句块中,执行是存在即可

  • **类名:**可以是任何有效的标识符,一般首字母大写
  • **类描述:**在类定义后首行,以独立的字符串形式定义;定义后通过<类名>.__doc__来访问

示例代码

复制代码
class TestClass:
    """这是一个测试的类"""
    print("Hello Class Object")


print(TestClass.\_\_doc\_\_)
print(type(TestClass))

'''
----输出结果----

Hello Class Object
这是一个测试的类
<class 'type'>
'''

类对象直接包含的语句会被执行,所有,定义类尽量不在类中直接包含语句

**实例对象:**实例对象是Python类最常用的方式

创建实例对象语法结构

<对象名> = <类名>(参数)

实例代码:

复制代码
class TestClass:
    print("一碗周")


tt = TestClass()
print(type(tt))
'''
----输出结果----

一碗周
<class '\_\_main\_\_.TestClass'>
'''

3.2 类的构造函数

概念:

  • 类的构造函数用于从类创建实例对象的过程
  • 类的构造函数为实例对象创建提供了参数输入方式
  • 类的构造函数为实例属性的定义和赋值提供了支持

Python中使用预定义的__init__()作为构造函数

语法结构:

复制代码
class ClassName:
    def \_\_init\_\_(self,\[参数1\], \[参数2\], ...\[参数n\]):
        <语句块>
    ...

实例代码:

复制代码
class TestClass:
    def \_\_init\_\_(self, name):
        print(name)


text1 = TestClass("张三")  # 张三
text2 = TestClass("李四")  # 李四

通过构造函数__init__可以为Python提供参数

**__init__()**的使用说明

**参数:**第一个参数约定是self,表示类实例自身,其他参数是实例参数(self是内部使用的,默认保留,其他用户输入的参数放到self后面)

函数名: Python解释器内部定义,由双下划线 (__) 开始和结束

**返回值:**构造函数没有返回值,或返回为None,否则产生TypeError异常

**self**在类定义内部代表类的实例

  • slef是Python面向对象中约定的一个类参数
  • self代表类的实例,在类内部,self用于组合访问实例相关的属性和方法
  • 相比,类名代表类对象本身

3.3 类的属性

属性是类内部定义的变量,语法结构如下:

复制代码
class ClassName:
    <类属性名> = <类属性初值>
    def \_\_init\_\_(self,\[参数1\], \[参数2\], ...\[参数n\]):
        self.<实例属性名> = <实例属性初值>
    ...
  • **访问类属性:<**类名>.<类属性>或者<对象名>.<类属性>
  • **访问实例属性:<**对象名>.<实例属性>

实例代码

复制代码
class TestClass:
    count = 0  # 类属性

    def \_\_init\_\_(self, name, age):
        self.name = name  # 实例属性
        self.age = name
        TestClass.count += 1  # 实例化一次 count+1


students1 = TestClass("张三", "18")
students2 = TestClass("李四", "19")
print("总数:", TestClass.count)  # 总数: 2
print(students1.name, students2.name)  # 张三 李四

3.4 类的方法

(1)实例方法:实例方法是类内部定义的函数,与实例对象无关,语法结构

复制代码
class ClassName:
    def <方法名>(self, <参数列表>):
        ...

<方法名>(<参数列表>)的方式使用实例方法的定义第一个参数是self

实例代码

复制代码
class TestClass:
    def \_\_init\_\_(self, number):
        self.number = number

    def sum\_number(self):  # 实例方法
        sum\_num = 0
        for i in range(self.number + 1):  # 因为循环不会到最后一个数字
            sum\_num += i
        return sum\_num


number1 = TestClass(100)
number2 = TestClass(10)
print(number1.sum\_number())  # 5050
print(number2.sum\_number())  # 55

(2)类方法:类方法是与类对象相关的函数,有所有实例对象共享,语法结构↓

复制代码
class ClassName:
    @classmethod
    def <方法名>(cls, <参数列表>):
        ...

<方法名>(<参数列表>)或者<类名>.<方法名>(<参数列表>)的方式使用,类方法至少包含一个参数,表示类对象,建议用@classmethod是装饰器,类方法定义所必须

类方法只能操作类属性和其他类方法,不能操作实例属性和实例方法。

实例代码

复制代码
class TestClass:
    sum\_num = 0

    def \_\_init\_\_(self, number):
        self.number = number

    def sum\_number(self):
        for i in range(self.number + 1):  # 因为循环不会到最后一个数字
            TestClass.sum\_num += i
        return TestClass.sum\_num

    @classmethod
    def test(cls):  # 类方法
        test\_value = TestClass.sum\_num \* 2
        return test\_value


value1 = TestClass(100)
print(value1.sum\_number())  # 5050
print(value1.test())  # 10100

(3)自有方法:自有方法是定义在类名空间中的普通函数,语法格式如下:

复制代码
class ClassName:
    def <方法名>(<参数列表>):
        ...

.<方法名>(<参数列表>)的方式使用,<类名>表示命名空间。自有方法不需要self或cls这类参数,可以没有参数。自有方法只能操作类属性和类方法,不能操作实例属性和实例方法。自由方法的使用只能使用<类名>

严格的说自由方法不是一个方法,只是一个定义在类中的函数

实例代码

复制代码
class TestClass:
    sum\_num = 0

    def \_\_init\_\_(self, number):
        self.number = number

    def sum\_number(self):
        for i in range(self.number + 1):  # 因为循环不会到最后一个数字
            TestClass.sum\_num += i
        return TestClass.sum\_num

    def test():  # 自由方法
        test\_value = TestClass.sum\_num \* 2
        return test\_value


def test\_out():  # 等于上面的那个自由方法
    test\_out\_value = TestClass.sum\_num \* 2
    return test\_out\_value


value = TestClass(100)
print(value.sum\_number())  # 5050
print(TestClass.test())  # 10100
print(test\_out())  # 10100

定义来类中的自由方法也可以定义到外面

(4)静态方法:定义在类中的普通函数,能够被所有实例对象共享

复制代码
class ClassName:
    @staticmethod
    def <方法名>(<参数列表>):
        ...

.<方法名>(<参数列表>)或者<类名>.<方法名>(<参数列表>)的方式使用静态方法也可以没有参数,可以理解为可以使用对象名调用的自有方法。 @staticmethod是装饰器,静态方法定义所必需的,静态方法同自由方法一样,只能操作类属性和类方法,不能操作实例属性和实例方法,不同的是可以通过<类名>或<对象名>。

示例代码

复制代码
class TestClass:
    sum\_num = 0

    def \_\_init\_\_(self, number):
        self.number = number

    def sum\_number(self):
        for i in range(self.number + 1):  # 因为循环不会到最后一个数字
            TestClass.sum\_num += i
        return TestClass.sum\_num

    @staticmethod  # 静态方法装饰器
    def test():
        test\_value = TestClass.sum\_num \* 2
        return test\_value


value = TestClass(100)
print(value.sum\_number())  # 5050
print(TestClass.test())  # 10100
print(value.test())  # 10100

(5)保留方法:有双下划线喀什和结束的方法,保留使用。语法结构↓

复制代码
class ClassName:
    def <保留方法名>(<参数列表>):
        ...

保留方法一般都对应类的某种操作,在使用操作符的时候调用是Python解释器中保留的方法


关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,希望提供给那些想学习 Python 的小伙伴们一点帮助!

保存图片微信扫描 下方CSDN官方认证二维码免费领取【保证100%免费】

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、Python基础学习视频

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!

因篇幅有限,仅展示部分资料

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

四、Python工具包+项目源码合集
①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

六、Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。

这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以保存图片微信扫描 下方CSDN官方认证二维码免费领取【保证100%免费】

相关推荐
进击的明明7 小时前
当AI开始“边想边干”:深入聊聊ReAct,以及如何用Python手搓一个简单Agent
python·面试·agent
全栈弄潮儿7 小时前
Python实战第8期:函数
后端·python·编程语言
卷无止境9 小时前
暗流与破局:AI时代的代码安全审查工具全景指南
后端·python
卷无止境12 小时前
一人公司的全栈选型指南:让 AI Agent 写得快,也让生意跑得稳
后端·python
结局无敌13 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
WJ.Polar13 小时前
Java封装、继承、多态
java·开发语言
摇滚侠13 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
ychqsq13 小时前
234.无题
经验分享·职场和发展
在所不辞兄13 小时前
为什么神经网络对对抗扰动和分布偏移往往比较脆弱,而人类感知相对更鲁棒?
人工智能·深度学习·神经网络·机器学习
滴啦嘟啦哒13 小时前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身