关键词:
文章目录
⛳️ 类的简介
Python 中的类本质上也是一种数据类型,对于初学者而言,Python 中【类】这个概念是非常抽象且复杂的,因为其包含很多概念,定义,所以在第一次学习的时候,重点是理解。
在正式学习类之前,需要先了解两种不同的编程思维,第一种是 面向过程 的编程,第二种是 面向对象 的编程,二者的英文单词分别是 OP(Procedure Oriented) 和 OO(Object Oriented),
如何理解 面向过程 和 面向对象 是非常重要的,下面为你带来几种容易理解的解释。
面向过程是一种线性思维,类似做完一件事情,再去完成下一件事情。
面向对象 是将一件事情所涉及的动作打包好,用的时候,拿过来使用。
面向对象 中的局部是 面向过程 的。
⛳️ 面向对象的编程
面向对象是对现实世界的抽象,它会把现实世界中的所有事务都当成 对象 进行处理,这个抽象过程就是面向对象,也是学习阶段最难的点。
将现实事务抽象成对象之后,就会碰到该知识点中最核心的一个概念【类】。
看一下类的定义:
把具有相同特性(属性)和行为(函数)的对象抽象为类。
这样阅读理解起来还是有难度的,那看一下实例。
最常见的类就是人类,先对人这个群体进行抽象,可以得到以下信息。
人有名字
人有年纪
人有身高
人有体重
人有父母
人有血型
……
人会说话
人会走路
人会爬
人会打架
人会睡觉
……
名字、年纪、体重是人的特性,属性,也可以叫做数据,说话、走路、打架是人的行为。
到这里你应该对人类有了一个基本的共识和抽象,我们再总结一下抽象成类的过程。
- 罗列,归纳,把形形色色的人都归为一类,命名为 Person;
- 提取特性,就是人的属性,例如名字,年纪,体重这些数据信息;
- 提取行为,例如说话,走路,爬,打架。
然后就是把人类定义出来,换成代码就是一个类的定义。
🔥 定义类
下面就展示人类 Person 的定义。
class Person():
# 构造函数
# name,age 是属性
def __init__(self,name,age):
# 属性的定义
self.name = name
self.age = age
# 定义方法
def sleep(self):
print("睡觉")
# 定义方法
def run(self):
print("跑步")
# 实例化对象,也叫类的实例化
p = Person('橡皮擦',18)
# 调用对象方法
p.sleep()
上述类的定义并未罗列全部属性和方法,仅作示例展示,其中涉及了类的基本知识如下。
class 关键字
所有类定义必须以 class
关键字开始,与上篇博客使用 def
定义函数一致。
类名 Person
类名格式遵循命名规则,一般大家遵守首字母大写的约定。类名后面是英文小括号(()
)加英文冒号(:
)。
类中第一行一般是文档说明
一个完善的类,默认会添加文档说明,语法格式为三引号包裹字符串,上述代码并未添加,我们对其进行一下补充。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
# name,age 是属性
def __init__(self,name,age):
# 属性的定义
self.name = name
self.age = age
# 实例化对象,也叫类的实例化
p = Person('橡皮擦',18)
类函数
类函数在类和实例中也叫做方法,在上述代码中出现了一个构造函数/方法,以及 sleep()
和 run()
函数。
类保留函数 __init__
和 self
关键字
保留函数就是我们编写代码时必须使用的函数,无法用其它函数代替,其包含固定函数名,例如前文的 __init__
。
__init__()
被称作构造函数,其功能是在实例化类时进行调用,最精简的格式如下:
def __init__(self):
其参数表中仅包含一个固定参数 self
,该关键字的作用是在实例使用的时候,用于传递实例对象地址,而且需要注意 self
参数是隐性传递的,也就是在实例化对象的时候,并没有给 self
进行赋值。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
# name,age 是属性
def __init__(self,name,age):
# 属性的定义
self.name = name
self.age = age
# 实例化对象,也叫类的实例化,这里只传递了 name 和 age 两个参数
p = Person('橡皮擦',18)
🔥 类的实例
实例化是一个命令,可以把类通过等号赋值给一个变量的过程,该过程就是实例化过程。示例代码已经在前文出现过:
p = Person('橡皮擦',18)
你可以由一个类实例化多个对象,并且每个对象之间互不影响。
p1 = Person('橡皮擦',18)
p2 = Person('擦哥',19)
类的实例对象可以调用其属性和方法,互相也没有影响。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
# name,age 是属性
def __init__(self,name,age):
# 属性的定义
self.name = name
self.age = age
def run(self):
print(self.name,'正在跑步')
# 实例化对象,也叫类的实例化,这里只传递了 name 和 age 两个参数
p1 = Person('橡皮擦',18)
p2 = Person('擦哥',20)
p1.run()
p2.run()
上述代码的输出可以看出 Person 实例化出的 p1
和 p2
在调用 run()
方法时,都输出了自己的姓名属性,即不同的 name
值。
同时类的实例在调用属性或者方法的时候,通过点号(.
)实现,示例代码如下:
# 实例化对象,也叫类的实例化,这里只传递了 name 和 age 两个参数
p1 = Person('橡皮擦',18)
p2 = Person('擦哥',20)
print(p1.name) # 通过点号调用属性
p1.run() # 通过点号调用方法
p2.run()
🔥 属性
属性是通过 _init__()
函数进行定义的,实例化的时候需要通过 self
参数传递值,初始化属性有两种方法,具体如下所示。
在 __init__()
中直接初始化值,例如下述代码将 name
,age
直接赋值。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
# name,age 是属性
def __init__(self):
# 属性的定义
self.name = '橡皮擦'
self.age = 18
也可以实例化的时候,进行初始化操作。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
# name,age 是属性
def __init__(self,name,age):
# 属性的定义
self.name = name
self.age = age
p1 = Person('橡皮擦',18)
还可以在实例化对象之后,直接设置属性值,请查看下述代码中 p.name
部分。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
# name,age 是属性
def __init__(self):
pass
def run(self):
print(self.name,'正在跑步')
# 实例化对象
p = Person()
p.name = '橡皮擦'
p.run()
如果希望修改属性值,可以直接对属性值进行操作,例如下述代码,直接操作属性 name
,对其进行重新赋值。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
def __init__(self):
self.name = '直接赋值'
def run(self):
print(self.name,'正在跑步')
# 实例化对象
p = Person()
p.name = '橡皮擦'
p.run()
实战中,还可以通过对象方法进行重新赋值。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
# name,age 是属性
def __init__(self):
self.name = '直接赋值'
# 修改 name
def change_name(self,new_name):
self.name = new_name
def run(self):
print(self.name,'正在跑步')
# 实例化对象
p = Person()
p.change_name('新橡皮擦') # 通过对象方法修改属性值
p.run()
🔥 类的继承和方法重写
在实战中有时候需要扩展一个类,或者重新类中的某些函数,例如之前声明了一个人类,在此基础上可以扩展一个孩子类,代码如下。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
def __init__(self,name,age):
self.name = name
# 修改 name
def change_name(self,new_name):
self.name = new_name
def run(self):
print(self.name,'正在跑步')
class Children(Person):
def __init__(self,name):
super().__init__(name,0)
def say(self):
print("哇哇哇~")
c = Children('新娃娃')
c.say()
继承就是在原有类的功能上新增功能(属性或方法),形成新的子类,被集成的类叫做父类或者基类,子类也叫做派生类,都是概念,对比牢记。还有一个知识点需要记忆,一个类可以继承多个父类。
再次对比代码学习一下继承的使用流程。
- 在子类声明的时候,需要引入父类名称,例如
Children(Person)
; - 需要重新给子类定义
__init__()
函数,如果父类__init__()
函数有参数,二者尽量保持一致; - 如果需要同步参数,需要用到
super()
函数; - 可以为子类增加新属性或者新方法。
继承父类之后,除了新增方法以外,还可以重写父类的方法,也就是在子类中定义一个与父类同名的函数。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
def __init__(self,name,age):
self.name = name
# 修改 name
def change_name(self,new_name):
self.name = new_name
def run(self):
print(self.name,'正在跑步')
class Children(Person):
def __init__(self,name):
super().__init__(name,0)
def say(self):
print("哇哇哇~")
def run(self):
print("小孩子,不会跑,只会爬~")
c = Children('新娃娃')
c.run()
🔥 类的私有属性和方法
在实战编码的时候经常会碰到定义一些私有属性或方法的场景,也就是类的部分成员只允许在类内部使用,此时就会用到私有概念,编写规则非常简单,在普通属性或方法前增加两个下划线(__
),示例代码如下。
class Person():
"""这是一个人类---文档字符串"""
# 构造函数
def __init__(self,name,age):
self.__name = name
# 修改 name
def change_name(self,new_name):
self.name = new_name
def run(self):
print(self.name,'正在跑步')
p = Person('新娃娃',18)
p.name
此时在调用 p.name
会出现如下错误,提示信息为 ‘Person’ 类不包含属性 name
。
AttributeError Traceback (most recent call last)
<ipython-input-16-39fea822b3f1> in <module>
15
16 p = Person('新娃娃',18)
---> 17 p.name
18
AttributeError: 'Person' object has no attribute 'name'
🔥 静态类
常见可实例化的类都是动态类,Python 中存在一种不可实例的类,其叫做静态类,静态类和动态类的区别如下。
- 静态类没有关键字
self
,所以其不能被实例化; - 静态类不能通过类名传递参数;
- 静态类虽然不能被实例化,但也具备属性和方法。
静态类的声明。
class StaticPersoon():
name = 'CA'
age = 18
def run():
print("跑步")
由于静态类不能被实例化,所以其使用的时候需要直接用类型调用,如下所示。
class StaticPersoon():
name = 'CA'
age = 18
def run():
print("跑步")
print(StaticPersoon.name)
🔥 类的其它知识
掌握类之后,就掌握类面向对象的编程方法,该方法有三大核心方法,分别是 【封装】、【继承】、【多态】,这些概念在本篇博客不做过多展开,等我们掌握模块并对模块熟悉之后,我们会继续对其复盘说明。
📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 744 篇原创博客
从订购之日起,案例 5 年内保证更新
写给python社群的第10课:python研发windows桌面程序,长长长的文(代码片段)
文章目录⛳️图形用户界面⛳️PyQt安装和designer工具🔥designer工具⛳️PyQtHelloWorld🔥完善窗体🔥学习组件⛳️组件学习🔥Label组件🔥LineEdit组件🔥Date/Time组件🔥CheckBox组件🔥ComboBox组件🔥 查看详情
写给python社群的第3课:列表和元组,就得对比着学(代码片段)
文章目录⛳️列表和元组简介⛳️列表学习要点🔥列表的声明语法🔥列表的读取🔥列表操作🔥列表元素的修改和删除🔥列表元素合并🔥列表元素顺序变化⛳️元组学习要点🔥元组基本知识🔥元... 查看详情
写给python社群的第8课:python异常,你必须掌握的技术点(代码片段)
文章目录⛳️异常是什么⛳️异常捕获⛳️异常类型⛳️raise抛出异常⛳️异常是什么任何程序都会出错,任何程序员都会写错代码,程序员编写程序一直处于编写,调试的循环中,程序异常也叫做程序BUG,一... 查看详情
写给python社群的第5课:python函数,真的难吗?(代码片段)
文章目录⛳️函数简介⛳️函数实战🔥定义函数🔥无参函数和带参函数🔥函数的返回值🔥函数的参数🔥函数的作用域⛳️函数简介这篇博客给大家带来的是Python函数,每次讲解到函数的时候,都会... 查看详情
写给python社群的第4课:字典和集合,又是一组新概念(代码片段)
文章目录⛳️字典简介⛳️字典的基本方法🔥字典元素添加🔥获取字典键对应的值🔥字典元素的修改🔥字典元素的删除🔥字典的遍历⛳️集合学习🔥集合添加元素🔥集合删除元素🔥统计集合个... 查看详情
写给python社群的第11课:python线程,进程,协程,3个毫无关系的兄弟(代码片段)
文章目录⛳️线程、进程与协程🔥进程与线程简介⛳️Python多线程模块🔥threading模块🔥threading模块实践⛳️Python并发进程模块🔥Process创建多进程⛳️线程、进程与协程线程、进程、协程这三个名称相似的概念... 查看详情
写给python社群的第7课:用python模块了不起呀?就是了不起(代码片段)
文章目录⛳️Python模块⛳️datetime模块🔥datetime对象常见的实例方法⛳️time模块⛳️random模块⛳️sys和os模块⛳️Python模块Python模块也叫做Python库,有环境内置的,也有第三方开发的,在Python任何一个项目中,... 查看详情
写给python社群的第11课:python线程,进程,协程,3个毫无关系的兄弟(代码片段)
文章目录⛳️线程、进程与协程🔥进程与线程简介⛳️Python多线程模块🔥threading模块🔥threading模块实践⛳️Python并发进程模块🔥Process创建多进程⛳️线程、进程与协程线程、进程、协程这三个名称相似的概念... 查看详情
写给python社群的第1课:初识python,开篇知识点就选字符串吧~(代码片段)
本系列博客,由“发量迷人的乔喻”授权发布。被系列博客来自78技术人社群的一次大冒险,没错,乔喻输了,它就要写。要简单,要通俗,要高雅,要有用,要有趣的介绍清楚Python。要能写购250K... 查看详情
神了!阿里资深大牛熬夜整理python学习路线,终于开放了
相信大家学习Python最苦恼的就是不知从何入手,或入门之后不知如何进阶。为了帮助大家顺利成为Python高手,我特地整理了这篇学习攻略,希望能帮大家找到学习的方向。Python入门Python是一门相对来说入门比较容易的... 查看详情
78技术人社群~python事业部,就在今天成立→(代码片段)
...社群二、社群价值体系三、入群门槛四、社群未来~五、Python学习路线📕Python的学习阶段📗基础夯实部分📘进阶部分📙实战部分一、为什么建立社群学习从来都不是一件轻松的事情,为了打破孤独学习这个魔... 查看详情
78技术人社群~python分部,就在今天成立→(代码片段)
...立社群二、社群价值体系三、入群门槛四、写在最后五、Python学习路线📕Python的学习阶段📗基础夯实部分📘进阶部分📙实战部分一、为什么建立社群学习从来都不是一件轻松的事情,为了打破孤独学习这个... 查看详情
别人的python爬虫代码能读懂,自己却还是不能自由去爬?社群日报(代码片段)
文章目录1.学Python的书籍,推荐一本2.从读懂代码,到自由去爬,中间隔着一层“熟练度”。3.老生常谈,Python爬虫到底违不违法4.异常:AttributeError:module'execjs'hasnoattribute'compline'5.Python中哪个函数能... 查看详情
你,为什么需要加入一个python社群呢?(代码片段)
...入一个线上社群如果你现在正在学习编程,正在学习Python,你恰好碰到了如下问题:😫Python未来的从业方向都有哪些?😫Python工程师的薪资待遇如何?😖如何快速的学习Python?😖 查看详情
你,为什么需要加入一个python社群呢?(代码片段)
...入一个线上社群如果你现在正在学习编程,正在学习Python,你恰好碰到了如下问题:😫Python未来的从业方向都有哪些?😫Python工程师的薪资待遇如何?😖如何快速的学习Python?😖 查看详情
1024,一封写给csdn家园python初学者的信|python初级中级高级学习路线
又是一年1024,祝所有程序员节日快乐,健康开心,祝CSDN越来越好。转眼,已经在CSDN分享了十多年博客,感谢大家的陪伴和祝福,在这里我与许多人成为了朋友,感恩。非常遗憾,这次没能去长沙... 查看详情
抖音上比较火的python学习,真的可以达到广告所说的水平嘛?
几块钱就能学会编程?都是套路。8.9元Python小课掀起编程热,网友:试学后又花了4位数报班。低价和刷量,是Python小课割韭菜的利器。销售的力量不就是这样吗,我卖python课,就得包装成google,facebook都特别重视,学会了就走上... 查看详情
python大白从零开始opencv学习课-6.灰度变换与直方图处理(代码片段)
从零开始OpenCV学习课-6.灰度变换与直方图处理本系列面向Python小白,从零开始实战解说OpenCV项目实战。空间域的图像处理方法直接对图像的像素点进行处理,空间域图像处理技术主要是灰度变换和空间滤波。本节介绍图... 查看详情