python 面向对象的概念及使用方法~(基础小知识)

这篇具有很好参考价值的文章主要介绍了python 面向对象的概念及使用方法~(基础小知识)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、面向对象的概念

1、面向对象的两个基本概念

编程语言中,一般有两种编程思维,面向过程和面向对象。

面向过程,看重的是解决问题的过程。

这好比我们解决日常生活问题差不多,分析解决问题的步骤,然后一步一步的解决。

而面向对象是一种抽象,抽象是指用分类的眼光去看世界的一种方法。

Python 就是一门面向对象的语言,

如果你学过 Java ,就知道 Java 的编程思想就是:万事万物皆对象。Python 也不例外,在解决实际问题的过程中,可以把构成问题事务分解成各个对象。

面向对象都有两个基本的概念,分别是类和对象。

用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象
是类的实例。

  • 对象

通过类定义的数据结构实例

2、面向对象的三大特性

面向对象的编程语言,也有三大特性,继承,多态和封装性。

  • 继承

即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。

例如:一个 Dog 类型的对象派生自 Animal 类,这是模拟"是一个(is-a)"关系(例图,Dog 是一个
Animal )。

  • 多态

它是指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为。

  • 封装性

“封装”就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是
增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限
来使用类的成员。

如果你是初次接触面向对象的编程语言,看到这里还一脸懵逼,不要紧,这是正常的。下面我们会通过大量的例子逐步了解 Python 的面向对象的知识。

二、类的定义和调用

1、怎么理解类?

类是什么?

个人认为理解类,最简单的方式就是:类是一个变量和函数的集合。

可以看下下面的这张图。
python 面向对象的概念及使用方法~(基础小知识)
这张图很好的诠释了类,就是把变量和函数包装在一起。

当然我们包装也不是毫无目的的包装,我们会把同性质的包装在一个类里,这样就方便我们重复使用。

所以学到现在,你会发现很多编程的设计,都是为了我们能偷懒,重复使用。

2、怎么定义类

知道了类是什么样子的,我们接下来就要学习怎么去定义类了。

类定义语法格式如下:
python 面向对象的概念及使用方法~(基础小知识)
可以看到,我们是用 class 语句来自定义一个类的,其实这就好比我们是用 def 语句来定义一个函数
一样。

竟然说类是变量和方法的集合包,那么我们来创建一个类。
python 面向对象的概念及使用方法~(基础小知识)
你看,上面我们就定义了一个类,类名叫做 ClassA , 类里面的变量我们称之为属性,那么就是这个类
里面有 3 个属性,分别是 var1 , var2 和 var3 。除此之外,类里面还有 3 个类方法 fun1() ,
fun2() 和 fun3() 。

3、怎么调用类属性和类方法

我们定义了类之后,那么我们怎么调用类里面的属性和方法呢?

直接看下图:
python 面向对象的概念及使用方法~(基础小知识)
这里就不文字解释了(注:做图也不容易啊,只有写过技术文章才知道,这系列文章,多耗时)

好了,知道怎么调用之后,我们尝试一下:
python 面向对象的概念及使用方法~(基础小知识)

三、类方法

1、类方法如何调用类属性

通过上面我们已经会定义类了,那么这里讲一下在同一个类里,类方法如何调用类属性的。

直接看个例子吧:
python 面向对象的概念及使用方法~(基础小知识)

注意看,在类方法上面多了个 @classmethod ,这是干嘛用的呢?

这是用于声明下面的函数是类函数。其实从名字就很好理解了。

class 就是类,method 就是方法。

那是不是一定需要注明这个呢?

答案是是的。

如果你没使用,是会报错的。
python 面向对象的概念及使用方法~(基础小知识)
如果没有声明是类方法,方法参数中就没有 cls , 就没法通过 cls 获取到类属性。

因此类方法,想要调用类属性,需要以下步骤:

  • 在方法上面,用 @classmethod 声明该方法是类方法。只有声明了是类方法,才能使用类属性
  • 类方法想要使用类属性,在第一个参数中,需要写上 cls , cls 是 class 的缩写,其实意思就是把
    这个类作为参数,传给自己,这样就可以使用类属性了。
  • 类属性的使用方式就是 cls.变量名

记住喔,无论是 @classmethod 还是 cls ,都是不能省去的。

省了都会报错。

2、类方法传参

上面我们学习了类方法如何调用类属性,那么类方法如何传参呢?

其实很简单,跟普通的函数一样,直接增加参数就好了。

这个就直接上例子了:
python 面向对象的概念及使用方法~(基础小知识)

学习更多知识或解答疑问、源码、教程请点击

四、修改和增加类属性

1、从内部增加和修改类属性

来,我们先来温习一下类的结构。
python 面向对象的概念及使用方法~(基础小知识)
看着这个结构,提一个问题,如何修改类属性,也就是类里面的变量?

从类结构来看,我们可以猜测,从类方法来修改,也就是从类内部来修改和增加类属性。

看下具体的实例:

python 面向对象的概念及使用方法~(基础小知识)
这里还是强调一下,例子还是要自己多写,不要只看,自己运行, 看效果。多想。

2、从外部增加和修改类属性

我们刚刚看了通过类方法来修改类的属性,这时我们看下从外部如何修改和增加类属性。

例子如下:
python 面向对象的概念及使用方法~(基础小知识)

五、类和对象

1、类和对象之间的关系

这部分内容主要讲类和对象,我们先来说说类和对象之间的关系。

类是对象的模板

我们得先有了类,才能制作出对象。

类就相对于工厂里面的模具,对象就是根据模具制造出来的产品。

从模具变成产品的过程,我们就称为类的实例化。

类实例化之后,就变成对象了。也就是相当于例子中的产品。

2、类的实例化

这里强调一下,类的实例化和直接使用类的格式是不一样的。

之前我们就学过,直接使用类格式是这样的:
python 面向对象的概念及使用方法~(基础小知识)
而类的实例化是怎样的呢?

是这样的,可以仔细对比一下,类的实例化和直接使用类的格式有什么不同?
python 面向对象的概念及使用方法~(基础小知识)
主要的不同点有:

  • 类方法里面没有了 @classmethod 声明了,不用声明他是类方法
  • 类方法里面的参数 cls 改为 self
  • 类的使用,变成了先通过 实例名 = 类() 的方式实例化对象,为类创建一个实例,然后再使用 实 例名.函数() 的方式调用对应的方法,使用 实例名.变量名 的方法调用类的属性

这里说明一下,类方法的参数为什么 cls 改为 self ?

其实这并不是说一定要写这个,你改为什么字母,什么名字都可以。

不妨试一下:
python 面向对象的概念及使用方法~(基础小知识)
你看,把 self 改为 aaaaaaaa 还是可以一样运行的。

只不过使用 cls 和 self 是我们的编程习惯,这也是我们的编程规范。

因为 cls 是 class 的缩写,代表这类 , 而 self 代表这对象的意思。

所以啊,这里我们实例化对象的时候,就使用 self 。

而且 self 是所有类方法位于首位、默认的特殊参数。

除此之外,在这里,还要强调一个概念,当你把类实例化之后,里面的属性和方法,就不叫类属性和类
方法了,改为叫实例属性和实例方法,也可以叫对象属性和对象方法。

为什么要这样强调呢?

因为一个类是可以创造出多个实例对象出来的。

你看下面的例子:
python 面向对象的概念及使用方法~(基础小知识)
我不仅能用这个类创建 a 对象,还能创建 b 对象

3、实例属性和类属性

一个类可以实例化多个对象出来。
python 面向对象的概念及使用方法~(基础小知识)
根据这个图,我们探究一下实例对象的属性和类属性之间有什么关系呢?

先提出第一个问题,如果类属性改变了,实例属性会不会跟着改变呢?

还是跟以前一样,提出了问题,我们直接用程序来验证就好。

看程序:
python 面向对象的概念及使用方法~(基础小知识)
从程序运行的结果来看,类属性改变了,实例属性会跟着改变。

这很好理解,因为我们的实例对象就是根据类来复制出来的,类属性改变了,实例对象的属性也会跟着
改变。

那么相反,如果实例属性改变了,类属性会改变吗?

答案当然是不能啦。因为每个实例都是单独的个体,不能影响到类的。

具体我们做下实验:
python 面向对象的概念及使用方法~(基础小知识)
可以看到,不管实例对象怎么修改属性值,对类的属性还是没有影响的。

4、实例方法和类方法

那这里跟上面一样,还是提出同样的问题。

如果类方法改变了,实例方法会不会跟着改变呢?

看下下面的例子:
python 面向对象的概念及使用方法~(基础小知识)
这里建议我的例子,各位都要仔细看一下,自己重新敲一遍。相信为什么要这么做,这么证明。

还是那句话多想,多敲。

回归正题,从运行的结果来看,类方法改变了,实例方法也是会跟着改变的。

在这个例子中,我们需要改变类方法,就用到了类的重写

我们使用了 类.原始函数 = 新函数 就完了类的重写了。

要注意的是,这里的赋值是在替换方法,并不是调用函数。所以是不能加上括号的,也就是 类.原始函数 () = 新函数() 这个写法是不对的。

那么如果实例方法改变了,类方法会改变吗?

如果这个问题我们需要验证的话,是不是要重写实例的方法,然后观察结果,看看类方法有没有改变,
这样就能得出结果了。

可是我们是不能重写实例方法。

你看,会直接报错。
python 面向对象的概念及使用方法~(基础小知识)

六、初始化函数

1、什么是初始化函数

初始化函数的意思是,当你创建一个实例的时候,这个函数就会被调用。

比如:
python 面向对象的概念及使用方法~(基础小知识)
当代码在执行 a = ClassA() 的语句时,就自动调用了 init(self) 函数。

而这个 init(self) 函数就是初始化函数,也叫构造函数。

初始化函数的写法是固定的格式:中间是 init ,意思是初始化,然后前后都要有【两个下划线】,然
init() 的括号中,第一个参数一定要写上 self ,不然会报错。

构造函数(初始化函数)格式如下:
python 面向对象的概念及使用方法~(基础小知识)

初始化函数一样可以传递参数的,例如:
python 面向对象的概念及使用方法~(基础小知识)

2、析构函数

竟然一个在创建的时候,会调用构造函数,那么理所当然,这个当一个类销毁的时候,就会调用析构函
数。

析构函数语法如下:
python 面向对象的概念及使用方法~(基础小知识)
python 面向对象的概念及使用方法~(基础小知识)

3、Python 定义类的历史遗留问题

Python 在版本的迭代中,有一个关于类的历史遗留问题,就是新式类和旧式类的问题,具体先看以下的代码:
python 面向对象的概念及使用方法~(基础小知识)
可以看到,这里使用了两者中不同的方式定义类,可以看到最大的不同就是,新式类继承了 object
类,在 Python2 中,我们定义类的时候最好定义新式类,当然在 Python3 中不存在这个问题了,因为
Python3 中所有类都是新式类。

那么新式类和旧式类有什么区别呢?

运行下下面的那段代码:
python 面向对象的概念及使用方法~(基础小知识)
这是 python 2.7 运行的结果:
python 面向对象的概念及使用方法~(基础小知识)
仔细观察输出的结果,对比一下,就能观察出来,注意喔,Pyhton3 中输出的结果是一模一样的,因为
Python3 中没有新式类旧式类的问题。

七、类的继承

1、定义类的继承

说到继承,你一定会联想到继承你老爸的家产之类的。

类的继承也是一样。

比如有一个旧类,是可以算平均数的。然后这时候有一个新类,也要用到算平均数,那么这时候我们就
可以使用继承的方式。新类继承旧类,这样子新类也就有这个功能了。

通常情况下,我们叫旧类为父类,新类为子类。

首先我们来看下类的继承的基本语法:
python 面向对象的概念及使用方法~(基础小知识)
多继承有一点需要注意的:若是父类中有相同的方法名,而在子类使用时未指定,python 在圆括号中父类的顺序,从左至右搜索 , 即方法在子类中未找到时,从左到右查找父类中是否包含方法。

那么继承的子类可以干什么呢?

继承的子类的好处:

  • 会继承父类的属性和方法
  • 可以自己定义,覆盖父类的属性和方法

2、调用父类的方法

一个类继承了父类后,可以直接调用父类的方法的,比如下面的例子, UserInfo2 继承自父类
UserInfo ,可以直接调用父类的 get_account 方法。
python 面向对象的概念及使用方法~(基础小知识)

3、父类方法的重写

当然,也可以重写父类的方法。

示例:
python 面向对象的概念及使用方法~(基础小知识)
这里就是重写了父类的构造函数。

4、子类的类型判断

对于 class 的继承关系来说,有些时候我们需要判断 class 的类型,该怎么办呢?

可以使用 isinstance() 函数,

一个例子就能看懂 isinstance() 函数的用法了。
python 面向对象的概念及使用方法~(基础小知识)
可以看到 isinstance() 不仅可以告诉我们,一个对象是否是某种类型,也可以用于基本类型的判断。

八、类的多态

多态的概念其实不难理解,它是指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不
同而表现出不同的行为。

事实上,我们经常用到多态的性质,比如:
python 面向对象的概念及使用方法~(基础小知识)
可以看到,我们对两个整数进行 + 操作,会返回它们的和,对两个字符进行相同的 + 操作,会返回拼接后的字符串。

也就是说,不同类型的对象对同一消息会作出不同的响应。

看下面的实例,来了解多态:
python 面向对象的概念及使用方法~(基础小知识)
可以看到,userVip 和 userGeneral 是两个不同的对象,对它们调用 printUserInfo 方法,它们会自动
调用实际类型的 printUser 方法,作出不同的响应。这就是多态的魅力。

要注意喔,有了继承,才有了多态,也会有不同类的对象对同一消息会作出不同的相应。

九、类的访问控制

1、类属性的访问控制

在 Java 中,有 public (公共)属性 和 private (私有)属性,这可以对属性进行访问控制。

那么在 Python 中有没有属性的访问控制呢?

一般情况下,我们会使用 __private_attrs 两个下划线开头,声明该属性为私有,不能在类地外部被
使用或直接访问。在类内部的方法中使用时 self.__private_attrs 。

为什么只能说一般情况下呢?

因为实际上, Python 中是没有提供私有属性等功能的。

但是 Python 对属性的访问控制是靠程序员自觉的。为什么这么说呢?

看看下面的示例:
python 面向对象的概念及使用方法~(基础小知识)
仔细看图片,为什么说双下划线不是真正的私有属性呢?我们看下下面的例子,用下面的例子来验证:
python 面向对象的概念及使用方法~(基础小知识)
输出的结果如下图:
python 面向对象的概念及使用方法~(基础小知识)

2、类专有的方法

一个类创建的时候,就会包含一些方法,主要有以下方法:

类的专有方法:
python 面向对象的概念及使用方法~(基础小知识)
当然有些时候我们需要获取类的相关信息,我们可以使用如下的方法:

  • type(obj) :来获取对象的相应类型;
  • isinstance(obj, type) :判断对象是否为指定的 type 类型的实例;
  • hasattr(obj, attr) :判断对象是否具有指定属性/方法;
  • getattr(obj, attr[, default]) 获取属性/方法的值, 要是没有对应的属性则返回 default 值
    (前提是设置了 default),否则会抛出 AttributeError 异常;
  • setattr(obj, attr, value) :设定该属性/方法的值,类似于 obj.attr=value;
  • dir(obj) :可以获取相应对象

的所有属性和方法名的列表:

3、方法的访问控制

其实我们也可以把方法看成是类的属性的,那么方法的访问控制也是跟属性是一样的,也是没有实质上
的私有方法。一切都是靠程序员自觉遵守 Python 的编程规范。

示例如下,具体规则也是跟属性一样的,
python 面向对象的概念及使用方法~(基础小知识)文章来源地址https://www.toymoban.com/news/detail-460039.html

到了这里,关于python 面向对象的概念及使用方法~(基础小知识)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【RabbitMQ】交换机的概念及使用

            RabbitMQ中,交换机是一个核心概念,主要用来将生产者生产出来的消息,传送到对应的队列中。实际上,生产者生产的消息从不会直接发送到队列,而是发送到交换机。交换机一方面接收来自生产者的消息,另一方面将这些消息推入队列。 四种类型的交换机: 直

    2024年01月25日
    浏览(35)
  • 爱上数据结构:栈和队列的概念及使用

    ​ ​ 🔥个人主页 : guoguoqiang. 🔥 专栏 : 数据结构 ​ 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作

    2024年04月16日
    浏览(30)
  • Linux系统vim,gcc,g++工具使用及环境配置,动静态库的概念及使用

    所属专栏:Linux学习❤️ 🚀 博主首页:初阳785❤️ 🚀 代码托管:chuyang785❤️ 🚀 感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️ 🚀 博主也会更加的努力,创作出更优质的博文!!❤️ 如果你的Linux下还没有安装vim,则执行下面指令: sudo yum install -y vim

    2024年02月04日
    浏览(32)
  • Python-面向对象:面向对象、成员方法 、类和对象、构造方法、魔术方法、封装、继承、类型注解、多态(抽象类(接口))

    当前版本号[20230806]。 版本 修改说明 20230806 初版 生活中数据的组织 学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生自己填, 易出现内容混乱 但当改为登记表,打印出来让学生自行填写, 就会整洁明了 程序中数据的组织 在程序中简单使用变量来记录学

    2024年02月14日
    浏览(51)
  • Python 面向对象(一)(成员方法、类和对象)

    学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生自己填 改为登记表,打印出来让学生自行填写: 在程序中简单使用变量来记录学生信息  使用变量记录数据太乱了。 如果程序中也和生活中一样 可以设计表格 可以将设计的表格打印出来 可以将打印好的表

    2024年02月15日
    浏览(49)
  • 【python】面向对象(类型定义&魔法方法)

    目录 一、引言 二、类型定义 1、什么是类型的定义? 2、案例 三、魔法方法 1、什么是魔法方法 2、基础部分 3、比较操作 4、容器类型 5、属性管理 6、封装 7、方法拓展 8、继承 9、多态         Python是一种面向对象的语言,它支持类( class )和对象( object )的概念。面

    2024年02月05日
    浏览(38)
  • Python 面向对象编程:类、对象、初始化和方法详解

    Python 是一种面向对象的编程语言。在 Python 中,几乎所有东西都是对象,都具有其属性和方法。 类似于对象构造函数或用于创建对象的“蓝图”的类。 要创建一个类,请使用 class: 示例,创建一个名为 MyClass 的类,其中包含一个名为 x 的属性: 现在,我们可以使用名

    2024年02月08日
    浏览(59)
  • VRRP的概念及原理

    VRRP(虚拟路由器冗余协议) VRRP是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故

    2024年02月08日
    浏览(39)
  • Python教程(22)——Python面向对象的属性和方法

    在Python面向对象编程中,属性和方法是类及其对象的重要组成部分。如果说封装、继承和多态是面向对象编程中的思想,那么类的属性和方法就是骨架,因为有属性和方法,面向对象编程才变的有血有肉。 属性是类或对象所拥有的数据,它用于描述对象的特征和状态。属性可

    2024年02月03日
    浏览(35)
  • Python基础-11 面向对象编程_各种方法

    python本身支持类的动态属性 直接使用等号=,给一个属性赋值 如果这个属性存在,则会修改该属性的值 如果这个属性不存在,则会给对象添加一个新的属性及对应的值 如果需要禁止动态添加类的属性,可以使用 __slots__ 属性,如下示例 这个属性直接定义在类中,是一个元组,用来规定

    2023年04月17日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包