python进阶五_类的使用定义

简介: python进阶五_类的使用定义

dc82ef0d7a00c4320ff3e286a4077b4d.png

ifove 发布于 2022-03-29 20:40:33来自


4e21548b82295ca39763d0c76ac57e6b.jpg

一.我们来好好研究一下“类”

1.Object 对象

学过java的朋友都清楚,在Java中,一切皆对象,是很纯正的面向对象语言,那么在python中呢?会不会也是这样呢?首先,不管是不是,我们先假设它是,然后去证明。如果在python中也是一切皆对象的话,那么一定有一个最原始的基类,就像Java中的Object一样,很容易的我们会猜想,会不会也是object的呢?我们通过交互命令来一看究竟:

aa65df95014880c0173f28d8abd64abc.png

果然,当我们通过 help 命令来查看的时候,发现了这些东西,首先这是一个 builtin 内置模块,其次,这是一个 most base 最顶层的基类,也就是说所有的类都继承自 object,最后,我们发现 object 类有很多内置属性,因此我们可以在我们的类中覆盖这些属性达到我们的目的。


30db13ff69361d3fec528e580c18d54f.png

在上面的这个例子中,我们调用了基类的 dir 和 str 方法,这里有一个问题,我们直接打印对象和我们调用基类的 str 结果是一样的,其实,当我们打印对象的时候,其自动调用__str__方法,不相信?我们再来一个例子,在这个例子中,我们覆盖__str__方法,看看打印对象之后产生什么结果。

a133ab16de74f17c17633de1211d5867.png


其实,其他的内建对象,我们都可以去覆盖重写,这就取决于你要写的类的功能了。

2.类的方法

1.静态方法


静态方法可以直接被类或类实例调用。它没有常规方法那样的特殊行为(绑定、非绑定、默认的第一个参数规则等等)。完全可以将静态方法当成一个用属性引用方式调用的普通函数来看待。任何时候定义静态方法都不是必须的。我们看一下类的静态方法的定义:


fbda279c560f4a724fd4dd6ab0704a76.png



静态方法的使用不必非得实例化(语言都是共通的),这点跟 Java 基本一样。

在类的静态方法中,我们要注意一个方法,new,当我们实例化一个类的时候,其实是类调用了__new__方法返回了一个类的对象,我们试试:


31a40d247280b8f46b72602282ebdf49.png


我们通过方法 isinstance 方法,来判断 Obj3 是否是 test 类的对象。但是,我们并不能直接通过__new__来获取对象,因为这个时候的 Obj3 仅仅只是个对象,可以简单的这么理解,那就是平常我们定义类的一个实例,其实是类先调用__new__生成对象,再来调用__init__进行初始化。我们验证一下:


a0bebf27f6efe9a2b53d2a4b99d2dd69.png



2.类方法(非静态)

类的方法很简单,基本上和函数无异,只是有一个需要注意的地方,那就是必须明确的指出 self(其实与名称无关,只与位置有关,一般约定为 self),我们来看一下一段实例:


c4ced3abf4b567c9fe6d832b7820b75e.png

3.类的属性(Properties)


我们都知道,类中的属性,相当于成员变量,当我们在外部引用类的属性的时候,类是如何工作的呢?这个就要从__getattr__方法说起了,__getattr__是拦截属性点号运算,准确的说应该是,当通过对未定义的属性名称和实例进行点号运算时,就会用属性名称作为字符串调用这个方法,若可以通过 python 的继承树向上搜索不到这个属性,方法就不会调用,我们来看一段例子:


a36aed528c183458cfd02983390541c5.png


这个时候我们,肯定会想一件事情,那就是,我们可不可以改了 value 的打印结果呢?我想应该可以把,试试:

6c0c8eb648d9cfd3bd96c9a80ceb3266.png


但是结果好像是不可以的,那该怎么办呢?我们来试试看另外一个方法__setattr__,该方法会拦截所有属性的赋值语句,如果定义了这个方法,self.attr = value 会变成 self.setattr(‘attr’,value)看一段代码:


80871c6361ff3d303d80a26d9a4b8b4f.png


但是,只要稍微心细一些就会发现,如果在__setattr__中对 self.value 进行赋值,就会陷入死循环,最后堆栈溢出异常,怎么解决呢?通常,我们是通过对属性字典做索引运算来赋值任何实例属性,也就是说,使用 self.dict[‘attrname’]=x,如下:


722bd3fa31b4c250f7406f5a66fc96da.png

4.怎样表达类成员的“private”属性?

在 C++ 中,我们有 public protect private 那么,在 python 中如何实现属性,甚至是函数的私有化呢?这里就要用到__X__了,看一段代码:


d9da97274ac56c93f958100bc941e9ba.png


属性和方法同理。

相关文章
|
14天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
19天前
|
传感器 物联网 机器人
定义微Python
MicroPython 是一种精简高效的 Python 解释器,专为微控制器和嵌入式系统设计,支持通过 Python 代码进行快速开发和调试。它具有低资源消耗的特点,适用于物联网设备。
97 62
|
1月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
21 1
|
1月前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
25 2
|
1月前
|
设计模式 开发者 Python
Python类里引用其他类
Python类里引用其他类
|
1月前
|
设计模式 开发者 Python
Python 类中引用其他类的实现详解
Python 类中引用其他类的实现详解
40 1
|
1月前
|
JSON 缓存 API
在 Python 中使用公共类处理接口请求的响应结果
在 Python 中使用公共类处理接口请求的响应结果
33 1
|
1月前
|
机器人 关系型数据库 Python
【Python篇】Python 类和对象:详细讲解(下篇)
【Python篇】Pyt hon 类和对象:详细讲解(下篇)
23 2
|
1月前
|
算法 Python
【Python篇】Python 类和对象:详细讲解(中篇)
【Python篇】Python 类和对象:详细讲解(中篇)
25 2
|
1月前
|
存储 C++ Python
【Python篇】Python 类和对象:详细讲解(上篇)
【Python篇】Python 类和对象:详细讲解(上篇)
32 2
下一篇
无影云桌面