带你从入门到精通——Python(九. 面向对象一)
class 类名:# 属性# 方法class 类名():# 属性# 方法class 类名(object):# 属性# 方法注意:类名需要遵守一般的标识符的命名规则,并且类名的首字母一般大写。# 1、定义一个类# 定义相关方法# 2、实例化对象# 3、调用类中的方法p1.eat()注意:类是一个抽象概念,在定义时,其并不会真正的占用计算机的内存空间。但是对象是一个具体的实体,所以其要占用计算机的内存
建议先阅读我之前的博客,掌握一定的Python前置知识后再阅读本文,链接如下:
带你从入门到精通——Python(一. 基础知识)-CSDN博客
带你从入门到精通——Python(二. 判断语句和循环语句)-CSDN博客
带你从入门到精通——Python(三. 函数基础)-CSDN博客
带你从入门到精通——Python(四. 五大容器一)-CSDN博客
带你从入门到精通——Python(五. 五大容器二)-CSDN博客
带你从入门到精通——Python(六. 函数进阶)-CSDN博客
带你从入门到精通——Python(七. 文件操作)-CSDN博客
带你从入门到精通——Python(八. 异常、模块和包)-CSDN博客
目录
九. 面向对象一
9.1 编程思想
编程思想就是人们利用计算机来解决实际问题的一种思维方式,常见的思维方式有面向过程和面向对象两种。
传统的面向过程的编程思想是一种自顶向下,逐步细化的过程,这种编程思想会把要开发的系统分解为若干个步骤,每个步骤就是可以用于实现该系统某部分功能的函数,当所有步骤全部完成以后,这个系统也就开发完毕了。
而如果使用面向对象的编程思想,首先想到的是需要开发的系统应该由哪几个实体来完成,每个实体又应该去实现什么样的功能,再把各个实体的属性和功能统一的进行封装,最后才去实现各个实体的功能。
因此,我们可以总结出面向过程编程和面向对象两种编程思想的区别如下:
1. 两种思想都可以实现代码重用和模块化编程,面向对象的模块化更深,数据也更封闭和安全。
2. 面向对象的思维方式更加贴近现实生活,更容易解决大型的复杂的业务逻辑。
3. 从前期开发的角度来看,面向对象比面向过程要更复杂,但是从维护和扩展的角度来看,面向对象要远比面向过程简单。
4. 面向过程的代码执行效率比面向对象高。
9.2 类和对象
在Python的面向对象编程(Object Oriented Programming,OOP)中有两个非常重要的概念:类和对象。
9.2.1 类的定义
类是具有相同或相似属性和动作的一组实体的集合,是对事物的抽象描述,在Python中类的定义方式如下:
class 类名:
# 属性
# 方法
class 类名():
# 属性
# 方法
class 类名(object):
# 属性
# 方法
注意:类名需要遵守一般的标识符的命名规则,并且类名的首字母一般大写。
9.2.2 对象的定义
类只是一种抽象的规范,如果想要使用类的功能,必须先利用类得到对象,而对象是类的实例,是根据类的定义创建的具体实体,而通过类得到对象的过程就被称为类的实例化,即是把抽象的类变为具体的对象的过程,具体示例如下:
# 1、定义一个类
class Person(object):
# 定义相关方法
def eat(self):
print('I am eating')
# 2、实例化对象
p1 = Person()
# 3、调用类中的方法
p1.eat()
注意:类是一个抽象概念,在定义时,其并不会真正的占用计算机的内存空间。但是对象是一个具体的实体,所以其要占用计算机的内存空间。
注意:上述例子中eat方法(在类内部定义的函数被称为方法)传入了self参数,而self是Python内置的关键字之一,它指向了类的实例对象本身,也就是说self就是类所实例化出来的对象本身,这是因为一个类可实例化多个对象,self能够用于区分是哪个对象调用了类的方法。
9.3 对象的属性和方法
在Python中,任何一个对象都应该由两部分组成:属性以及方法。
属性表示的是对象的固有特征,在Python中使用变量表示,可以使用对象名.属性 = 属性值的方式定义,也可以使用对象名.属性的方式获取属性值,具体示例如下:
# 1、定义一个Person类
class Person(object):
pass
# 2、实例化Person类,生成p1对象
p1 = Person()
# 3、为p1对象添加属性
p1.name = '小明'
p1.age = 18
print(p1.name, p1.age)
# 输出 '小明 18'
方法表示的是对象的行为,在Python中用定义在类中的函数表示,方法的第一个参数通常是self,用于表示示例对象本身,该参数不需要我们传递,python解释器会自动把当前的对象的引用传递过去。
可以在类中使用def关键字来定义方法,并使用对象名.方法()的方式来调用方法,具体示例如下:
# 1、定义一个Person类
class Person(object):
def dianzhan(self):
print('正在点赞。。。')
# 2、实例化Person类,生成p1对象
p1 = Person()
# 3、调用对象的方法
p1.dianzhan()
# 输出 '正在点赞。。。'
如果想要在类的内部获取对象的属性,或者是调用对象的方法,可以使用self.属性/方法()的格式进行调用,具体示例如下:
class Person(object):
def dianzhan(self):
print('正在点赞。。。')
def sanlian(self):
print(self.name)
self.dianzhan()
print('正在关注和收藏。。。')
p1 = Person()
p1.name = '小明'
p1.sanlian()
# 输出如下:
# 小明
# 正在点赞。。。
# 正在关注和收藏。。。
9.4 魔术变量和魔术方法
9.4.1 魔术变量
在 Python 中,魔术变量(也称为特殊变量或内置变量)是一些预定义的、拥有特殊功能的变量,它们的开头和结尾都是双下划线__,这些变量通常用于特定的内部用途,常见的魔术变量如下:
__name__变量:如果直接运行该魔术变量所处的py文件,则该py文件中的__name__变量为__main__;如果将该魔术变量所处的py文件作为模块导入,则该py文件中的__name__变量为模块名(即不带.py后缀的、该魔术变量所处的py文件的文件名);在多进程中,创建子进程时会将父进程所处的py文件作为模块导入,此时该py文件中的__name__变量为__mp_main__。
__file__变量:用于获取该魔术变量所处的py文件的绝对路径。
9.4.2 魔术方法
在Python中,魔术方法(也称为特殊方法或双下划线方法)是一些以双下划线 ‘__’ 开头和结尾的、拥有特殊功能的方法,这些方法在特殊情况下会被自动调用,不需要开发者手动去调用,通常用于实现一些特殊的功能,注意:魔术方法也属于方法,因此它们的第一个参数也应该为self。
9.4.2.1 __init__()方法
在Python中,当创建一个新的对象时,则会自动调用__init__()魔术方法(也称构造方法),该方法可以完成对象的初始化,为对象添加上相应的属性,示例如下:
# 可以不在__init__()方法中设置形参,直接初始化属性
class Person(object):
def __init__(self):
self.name = '小红'
self.age = 20
p1 = Person()
# 可以在__init__()方法中设置形参,根据传入的实参来初始化属性
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('小红', 20)
注意:如果__init__()方法添加了除self以外的其他参数,在创建对象时必须传入其所需的参数,如果没有添加其他参数,则创建对象时无需传递参数。
9.4.2.2 __str__()方法
在使用print函数打印对象的时候,默认会打印对象的内存地址,而如果类定义了__str__()方法,那么print函数就会打印该方法中return的数据,使用str()函数时同理,如果类没有定义__str__()方法,使用str()函数后会得到对象的内存地址的字符串,而如果类定义了__str__()方法,使用str()函数后会获得该方法中return的数据,注意:__str__方法必须返回字符串类型数据,具体示例如下:
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'{self.name}今年{self.age}岁了'
p1 = Person('小红', 20)
print(p1)
# 输出 '小红今年20岁了'
# 没添加__str__()方法时print输出 '<__main__.Person object at 0x0000018E35DD5940>'
9.4.2.3 __del__()方法
当删除对象时(调用del删除对象或者文件执行结束后),python解释器会自动调用__del__()方法(也称析构方法)以释放空间,主要用于关闭文件操作、关闭数据库连接等等,示例如下:
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __del__(self):
print('析构方法被调用了')
p1 = Person('小红', 20)
del p1
# 输出 '析构方法被调用了'
9.4.2.4 其他常见魔术方法
__len__()方法:当你在一个对象上调用len()函数时,Python解释器会自动调用该对象的__len__()方法,并将该方法的返回值当做该对象的长度,该方法的返回值通常为一个整数类型的数据,注意:我们无法在没有实现__len__()方法的对象上调用len()函数。
__call__()方法:实现__call__()方法后,能够允许对象像函数一样被调用,也就意味着你可以使用对象名()的格式来调用一个对象,就像调用函数一样,而__call__ 方法在对象被调用时会自动执行。
__repr__ ()方法:__repr__()方法用于返回对象的“官方”字符串表示形式,该方法的返回值只能为字符串类型的数据,并且该方法返回的字符串应该要能尽可能地唯一地标识对象,通常是返回对象的内存地址,该方法的名字来源于单词representation,此单词的中文释义为代表、表示。如果对象没有实现__str__()方法,则在调用print函数打印对象,或者使用str()函数进行类型转换时,都会默认调用__repr__ 方法来打印或返回对象的内存地址,而如果以repr(对象名)的格式直接使用repr()函数,则会直接返回对象的内存地址。
__eq__()方法、__gt__()方法和 __lt__()方法是用于定义比较操作的魔术方法,这些方法用于进行对象之间的比较操作,除了self参数之外,这些魔术方法还必须额外接收一个other参数,other参数代表另一个参与比较的对象。在使用==运算符时会被自动调用左边对象的__eq__()方法,返回参与比较的两个对象是否满足相等关系;在使用>运算符时会被自动调用左边对象的__gt__()方法,返回参与比较的两个对象是否满足大于关系;在使用<运算符时会被自动调用左边对象的__lt__()方法,返回参与比较的两个对象是否满足小于关系,注意:这些魔术方法的返回值通常是一个布尔值,但也可以为其他的数据类型(不建议)。
__getitem__()方法和__setitem__()方法是用于定义[]操作符的魔术方法,进而使得对象能够像字典或列表一样使用方括号[]进行取值和赋值操作,__getitem__()方法用于获取对象某个key值所对应的元素值,该方法通常需要传入一个参数作为key值,当使用方括号[]访问该对象的某个key值时,会自动调用__getitem__()方法返回此时key值所对应的元素值;__setitem__()方法用于设置对象某个key值所对应的元素值,该方法通常需要传入两个参数,即key值和value值,当使用方括号[]给对象的key值进行赋值时,会自动调用__setitem__()方法将value值赋给key值。

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)