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

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

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

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

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

也许你会觉得这些概念对现在的你还太过遥远,那我想再给你看看一个没那么复杂的玩意儿;
在这里插入图片描述
比如这个画风清奇的小游戏,玩家可以通过键盘控制滑雪者来躲避障碍物。它是Charles制作的小游戏,链接:
https://github.com/CharlesPikachu/Games/tree/master/Game4
这个游戏是用Python写的,它的实现基础就是我们今天要学习的内容,我想等你学完基础语法后,你也能试着去理解源代码,琢磨些有趣好玩的程序,不断精进编程水平。

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

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

“类”的基本概念

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

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

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

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

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

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

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

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

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

运行结果:

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

输出结果是<class ‘str’>,表明1属于字符串类,以此类推。

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

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

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

在这里插入图片描述

万事万物,皆为对象

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

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

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

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

所以,在Python中有这么一句话:
在这里插入图片描述
现在我们明白类、实例、对象三者之间的关系,接下来我们就可以用代码制造一个对象,也就是类与实例的创建。

类的创建和调用

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

我们都是中国人

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

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

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

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

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

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

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

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

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

而编程世界中各个类的属性和方法,是需要我们自行创建的(实际上整数、列表这些内置数据类型也是需要的,只不过Python预先创建好了,我们可以直接使用)。
在这里插入图片描述
那么,接下来我们就来学习如何自定义一个类吧~

类的创建

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

class Computer:

    screen = True

    def start(self):
        print('电脑正在开机中……')

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

这是对代码的生活化解释,下面我们来看具体的含义:
在这里插入图片描述
可以看到:实例方法的创建语句,和函数的定义语句很类似,唯一不同的是:实例方法中有个必须放在首位的参数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()。这个过程叫作:类的实例化,即在某个类下创建一个实例对象。
在这里插入图片描述
我们来试下打印实例类型和直接打印出实例,会是什么结果。

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>

第一行:<class ‘main.Computer’>验证了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
吃饭,选择用筷子。

恭喜你!至此,你已经掌握了类的最基础的用法:简单的创建和调用。

总结

归纳一下三个步骤就是:创建一个类 —— 类的实例化 —— 用实例调用类的属性和方法。
在这里插入图片描述
再啰嗦一句:类中创建的属性和方法可以被其所有的实例调用,而且,实例的数目在理论上是无限的。我们可以同时“新建”多个实例:

# 阅读代码后请运行    
class Chinese:
    eye = 'black'

    def eat(self):
        print('吃饭,选择用筷子。')

# 类的实例化:创建多个实例
wufeng = Chinese()
jiangjiang = Chinese()
kaxi = Chinese()

print(jiangjiang.eye)
wufeng.eat()
kaxi.eat()

运行结果:

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

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

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大师兄6668

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值