【python基础知识】12.类与对象(一)

简介: 【python基础知识】12.类与对象(一)

类与对象(一)


这篇文章中,我们会接触到一种全新的编程思维:面向对象编程(Object Oriented Programming)。相信这种编程思维,会为你打开一个新的世界。


可以说,要想利用Python做出更复杂更炫酷的程序,这种编程思维就是绕不过的坎。


我想此刻你的小脑瓜会冒出三连问:那到底面向对象编程是什么?有什么用?要怎么用?


我用一句话来剧透就是:面向对象编程是一种以对象为中心的编程思想,它在软件设计、数据库设计、网络结构设计、人工智能算法等领域有着非常广泛的应用。


也许你会觉得这些概念对现在的你还太过遥远,那我想再给你看看一个没那么复杂的玩意儿;

1.png

比如这个画风清奇的小游戏,玩家可以通过键盘控制滑雪者来躲避障碍物。它是Charles制作的小游戏,链接:

https://github.com/CharlesPikachu/Games/tree/master/Game4


这个游戏是用Python写的,它的实现基础就是我们今天要学习的内容,我想等你学完基础语法后,你也能试着去理解源代码,琢磨些有趣好玩的程序,不断精进编程水平。


兴奋起来了吗?那我们就开始正式学习之旅咯!


了解概念,是这次旅程的起点,也是后面课程的基础。所以,注意力一定要集中哦!


“类”的基本概念


看到“类”这个字,你的第一反应是什么,想到了什么词语?


人类?鸟类?鱼类?植物类?没错,我们常用类来划分一个个特定的群体。


现在,请你用几秒的时间,让眼睛离开屏幕,留意一下周围,看看都有哪些种类的物品。


发现了吗?在我们的身边,事物被井井有条地划分成了各个种类,如电子类、家具类、服饰类、食品类……


再想一想:你每次逛超市或网上购物时,是不是也被各种品类的商品所包围?

image.png

这便是生活中我们所说的类,是物以类聚的类,是分门别类的类,是多个类似事物组成的群体的统称。类的概念能帮助我们快速理解和判断事物的性质。


同样在编程世界里,其实我们从第一天开始就在接触类(class),比如整数、字符串、浮点数等,不同的数据类型就属于不同的类。


准确来说,它们的全名是整数类、字符串类、浮点数类。我们可以用type()函数来验证一下:

print(type('1')) # '1'属于字符串类'str'
print(type(1))  # 1属于整数类'int'
print(type([1])) # [1]属于列表类'list'

运行结果:

<class 'str'>
<class 'int'>
<class 'list'>

输出结果是,表明1属于字符串类,以此类推。


不难发现,类之所以为类是因为每一个类之下都包含无数相似的不同个例。比如你正在看的这台电脑和我写稿的电脑,都属于电脑类;你和我,都属于人类。


编程世界中,每个类也会有众多实际的个例。比如数字1和2,都属于整数类;‘第一个栗子’和’第二个栗子’,都属于字符串类。


在Python的术语里,我们把类的个例就叫做实例 (instance),可理解为“实际的例子”。

image.png

万事万物,皆为对象


当然,这里说的不是“找对象”的对象,也不是🐘🐘,而是面向对象编程中的对象(object)。那么,它究竟是什么?


一言以蔽之:Python中的对象等于类和实例的集合:即类可以看作是对象,实例也可以看作是对象,比如列表list是个类对象,[1,2]是个实例对象,它们都是对象。


事实上现实生活中也类似,不论是类还是实例,都可以当作行动或思考的对象。


例如:我们会说“电脑很强大”,也会说“我的电脑卡了”。前者说的是电脑类(类对象),后者说的是我的电脑(实例对象)。


所以,在Python中有这么一句话:

image.png

现在我们明白类、实例、对象三者之间的关系,接下来我们就可以用代码制造一个对象,也就是类与实例的创建。


类的创建和调用


对你来说,今天是第一次正式接触编程中“类”这个概念。为了让你能顺利理解它,前面我用了很多现实和编程之间的类比。下面也会如此。


我们都是中国人


我和你,都是中国人——这句话里隐藏着一个共识:我们都属于中国人这个类,所以我们(作为实例)存在一些共同点。例如:黑眼睛、黄皮肤、用筷子吃饭、会讲汉语……


而这些共同点,就是我们区别于其他类的依据,细分的话其实可以分成两种。


哪两种呢?想三秒,我再给答案。3、2、1……


第一种是描述事物是怎样的,有什么特征,比如黑眼睛、黄皮肤。


第二种是描述事物能做什么,有哪些行为和作用,比如能用筷子吃饭、会讲汉语。


在编程世界中,亦是如此。我们会把第一种共同点叫作属性(即what),第二种叫作方法(即how)。


比如列表的属性有:外层有中括号,元素之间用英文逗号隔开,方法有:都可以做增删改操作(如 append、del等)。


Python里的每个类都有自己独特的属性(attribute)和方法(method),是这个类的所有实例都共享的。换言之,每个实例都可以调用类中所有的属性和方法。


不过呢,编程中还是有一点和现实不同。那就是——现实世界中各个类的属性和方法是我们根据客观存在做出的抽象总结。


而编程世界中各个类的属性和方法,是需要我们自行创建的(实际上整数、列表这些内置数据类型也是需要的,只不过Python预先创建好了,我们可以直接使用)。

image.png

那么,接下来我们就来学习如何自定义一个类吧~


类的创建


我们先来看一个创建电脑类的示例代码:

class Computer:
    screen = True
    def start(self):
        print('电脑正在开机中……')

应该能读懂吧?电脑类,都有屏幕,所以属性screen的值为True;开机时会显示“电脑正在开机中……”。


这是对代码的生活化解释,下面我们来看具体的含义

6.png

可以看到:实例方法的创建语句,和函数的定义语句很类似,唯一不同的是:实例方法中有个必须放在首位的参数self。(关于self的特殊作用,我会在后面细讲)


除此之外,类名的首字母要大写,以便让我们轻松地辨认出“哦!这个是类!”


下面,我们现学现用,创建一个“中国人”的类,并为其创建一个属性和一个方法。

# 类名首字母大写
class Chinese:
    # 用赋值语句,创建类的属性
    eye = 'black'
    # 创建实例方法时,不要漏了 self
    def eat(self):
        print('吃饭,选择用筷子。')

不过运行代码,终端会一片空白,这是因为我们只完成了创建,还没有调用。


下面,就让我们将创建好的属性和方法用起来吧~


类的调用


还是以那个电脑类为例(重点看最后三行代码):

class Computer:
    screen = True
    def start(self):
        print('电脑正在开机中……')
my_computer = Computer()
print(my_computer.screen)
my_computer.start()

调用的关键在第7行代码:my_computer = Computer()。这个过程叫作:类的实例化,即在某个类下创建一个实例对象。

image.png

我们来试下打印实例类型和直接打印出实例,会是什么结果。

class Computer:
    screen = True
    def start(self):
        print('电脑正在开机中……')
my_computer = Computer()
print(type(my_computer))
print(my_computer)

运行结果:

<class '__main__.Computer'>
<__main__.Computer object at 0x7f28a9c9f070>

第一行:验证了my_computer属于Computer这个类;第二行打印出Computer类的一个实例对象(object),后面的一串字符表示这个对象的内存地址。


当实例my_computer一被创建出来,就可以调用类中的属性和方法。一句话概括就是:类有的实例都会有。


调用的语法是实例名.属性和实例名.方法,仔细看最后两行代码,然后运行:

class Computer:
    screen = True
    def start(self):
        print('电脑正在开机中……')
my_computer = Computer()
print(my_computer.screen)
my_computer.start()

运行结果:

True
电脑正在开机中……

倒数第二行:my_computer.screen先是获取到类属性screen对应的值True,再用print()打印出来。


最后一行:my_computer.start()调用方法start(),这个方法的功能是直接打印出’电脑正在开机中……'。


细心的同学可能会有这样的疑惑:为什么实例调用方法时不用传参,定义时不是有个参数self吗?


这就是参数self的特殊之处:在定义时不能丢,在调用时要忽略。至于它的作用,容我再卖个关子。


现在,咱们就趁热打铁,完成对类属性和方法的调用。在下面的代码中完整地使用类的创建和调用:

class Chinese:      # 创建一个类
    eye = 'black'
    def eat(self):
        print('吃饭,选择用筷子。')
wufeng = Chinese()   # 类的实例化
print(wufeng.eye)   # 实例调用类属性
wufeng.eat()  # 调用类中的方法(传参不用管self)

运行结果:

black
吃饭,选择用筷子。

总结


归纳一下三个步骤就是:创建一个类 —— 类的实例化 —— 用实例调用类的属性和方法。

image.png

再啰嗦一句:类中创建的属性和方法可以被其所有的实例调用,而且,实例的数目在理论上是无限的。我们可以同时“新建”多个实例:

# 阅读代码后请运行    
class Chinese:
    eye = 'black'
    def eat(self):
        print('吃饭,选择用筷子。')
# 类的实例化:创建多个实例
wufeng = Chinese()
jiangjiang = Chinese()
kaxi = Chinese()
print(jiangjiang.eye)
wufeng.eat()
kaxi.eat()

运行结果:

black
吃饭,选择用筷子。
吃饭,选择用筷子。

因此,类也被称为“实例工厂”,因其为所有实例提供了一套蓝图(即预先设定好有什么属性和方法)。


好,现在你已经学会了创建和调用类的基础语法了。下一站,我们就来深入探讨创建类的两个关键点。

相关文章
|
26天前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
119 3
|
1月前
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
66 0
|
5月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
242 15
|
5月前
|
安全 测试技术 开发者
Python中的“空”:对象的判断与比较
在Python开发中,判断对象是否为“空”是常见操作,但其中暗藏诸多细节与误区。本文系统梳理了Python中“空”的判定逻辑,涵盖None类型、空容器、零值及自定义对象的“假值”状态,并对比不同判定方法的适用场景与性能。通过解析常见误区(如混用`==`和`is`、误判合法值等)及进阶技巧(类型安全检查、自定义对象逻辑、抽象基类兼容性等),帮助开发者准确区分各类“空”值,避免逻辑错误,同时优化代码性能与健壮性。掌握这些内容,能让开发者更深刻理解Python的对象模型与业务语义交集,从而选择最适合的判定策略。
184 5
|
5月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
115 11
|
8月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
325 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
6月前
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
103 1
|
9月前
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
183 2
|
9月前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
201 3
|
9月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。

热门文章

最新文章

推荐镜像

更多