Python从进阶到高级—通俗易懂版(一)
# ==================================
# Author : Mikigo
# IDE :Typora
# Env :deepin 20.4 os
# ==================================
1、简介
前面分享了 Python 基础的内容,接下来这段时间我将分阶段分享 Python 进阶到高级编程的内容。
Python 进阶是我一直很想写的,作为自己学习的记录,过去自己在看一些代码的时候经常会困惑,看不懂,然后自己去查资料、看书籍,慢慢的一个个弄懂,经常沉浸其中。关于 Python 高级语法的资料、书籍不少,详细是详细,但是总感觉写的太复杂,学习有难度,而且不能使人印象深刻。
“TLDR
” 是流行的互联网行话,意思是“太长不读( to long didn't read )”。其实很多内容的核心知识就那么一点,细枝末节的东西蛮多,描述词句也很官方很晦涩,很难读懂,给人感觉就是每个字我都认识,怎么放到一起就不认识了。通俗易懂版就是想用一种比较轻松、简单的方式说明其中的重点且常用的内容,在写作的过程中我也时常告诫自己要克制,别整复杂了。
Python 是一门很容易入门的语言,但是要进阶其实需要花费大量的时间和精力,而且还需要不断的练习使用,或许你已经花了两个月时间学习了 Python 基础并能够写一些小脚本,或许你已经达到一定高度能独立编写大型项目,但是学习永无止境,我们都还有很多需要学习提升的地方。本系列文章内容绝大部分都是我在项目中用过的,很多描述是我自己的理解,可能会和官方有一定出入,但是相信大差不差,也欢迎有心人不吝赐教。
2、鸭子类型
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 这是百科上对它的解释。
鸭子类型(duck typing)是动态类型的一种风格,鸭子类型对于 Python 编码来讲非常重要,理解它能让你真正理解什么是一切皆对象,更有助于我们理解这门语言的设计思想和实现原理,而不是仅仅浮于表面的念经 “一切皆对象”。
鸭子类型始终贯穿与 Python 代码当中,一个对象它是什么类型取决于它实现了什么协议,因此可以说 Python 是一种基于协议的编程语言。
那这些协议是什么,又有哪些协议?这里的协议,更多的时候我们称为魔法函数或魔法方法,因为它具有很多神奇的魔力,坊间因此称之为魔法函数。
在 Python 里面,所有以双下划线开头,且以双下划线结尾的函数都是魔法函数,就像 __init__
这种,它们是 Python 语言天然自带的,不是通过某个类去继承而来的,我们也不要随意去自定义一个这样的函数,小心着魔。
魔法函数有很多,但是经常用到的也没多少,常用的一些魔法函数在后面的内容会逐步介绍到。
3、类型判断
在判断数据类型的时候常见的有两种方法:isinstance
和 type
isinstance("123", str) # 返回布尔值
type("123") # 直接返回类型
isinstance 主要用于判断对象的类型。这个好理解,不多讲。
type 可以查看类型,但它能做的远不止于此,它主要用于动态的创建类。
t = type("Mikigo", (), {"name": "huangmingqiang"})
T = t()
print(t)
print(T.name)
print(type(t))
<class '__main__.Mikigo'>
huangmingqiang
<class 'type'>
你看,我们定义了一个类并赋值给 t,类名为 Mikigo
,t 是类对象的引用,name 是其中的属性,Python 中一切都是对象,类也是对象,只不过是一种特殊的对象,是 type
的对象。
这个地方有点绕哈,你细品。
我看到网上好多讲 type
函数,准确讲 type
是一个类,只是用法像函数。在源码中:(通过 Pycharm
按住 Ctrl
点击进入)
class type(object):
def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
"""
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type
# (copied from class doc)
"""
pass
有同学要问了,为什么源码里面有 pass
,你没看错,源码里面就是写的 pass
,这种实际上是由于底层是由 C 语言实现的(本文内容都是基于 CPython
),一般的操作是看不到源码的,之所以能看到是因为 Pycharm
给我们提供的功能(其他编辑器不知道哈,没咋用过其他的),相当于以代码的形式看文档,所以我们看到的不是真正的源码,但是最接近于源码的源码,姑且称之为源码吧。
type 的参数说明:
-
当 type() 只有一个参数时,其作用就是返回变量或对象的类型。
-
当 type() 有三个参数时,其作用就是创建类对象:
- 参数 1:
what
表示类名称,字符串类型; - 参数 2:
bases
表示继承对象(父类),元组类型,单元素使用逗号; - 参数 3:
dict
表示属性,这里可以填写类属性、类方式、静态方法,采用字典格式,key
为属性名,value
为属性值。
@staticmethod def my_static(): print("this is static") t = type("Mikigo", (), {"name": "huangmingqiang", "static": my_static}) T = t() t.static() T.static()
this is static this is static
这样就添加了一个静态方法,很清楚哈,关于静态方法是什么我们后面文章会讲到,这里只需要知道 type 创建类的方法就好了。
- 参数 1:
通过上面 type 的源码可以看到,type 是继承了 object 的,我们知道所有类的顶层类都是继承的 object,那 object 又是从哪里来的?打印看一下:
print(type(object))
<class 'type'>
好家伙,object 也是由 type 创建的,前面说了 type 继承了 object,这俩哥们儿完美闭环了,我直接好家伙,理解起来有点更绕了哈。
你也可以说 type 自己创建了自己,这里要细细的品。实际上如果你了解指针的概念,这里其实也不难理解,不就是自己指向自己嘛,所以说 type 创建了所有类,因为他连他自己都不放过,还有什么事情做不出来。
本文来自博客园,作者:mikigo,转载请注明原文链接:https://www.cnblogs.com/mikigo/p/16812942.html