详解python中的生成器表达式
楔子
作为动态语言,python里面提供了很多以双下划线:__
开头和结尾的属性,我们称之为魔法属性,这些属性是对象所内置的。我们可以直接通过这些魔法属性动态地查看一个对象的信息,下面我们就来看一看。
__name__
__name__
是用来获取一个对象的名字的
print(int.__name__) # int
print(type.__name__) # type
def foo(): pass
print(foo.__name__) # foo
class A:
pass
print(A.__name__) # A
print(object.__name__) # object
import sys
print(sys.__name__) # sys
import pandas as pd
print(pd.__name__) # pandas
我们看到类、函数、模块都具有__name__
属性,但是注意:实例对象没有__name__
属性,比如:123、"string"、{"a": 111}。
这里提一下__name__和__qualname__
估计有人不清楚这个__qualname__
是做什么的,这个__qualname__
称之为全限定名。
print(str.__name__) # str
print(str.__qualname__) # str
print(str.join.__name__) # join
print(str.join.__qualname__) # str.join
class A:
class B:
def foo(self):
pass
print(A.B.foo.__name__) # foo
print(A.B.foo.__qualname__) # A.B.foo
import tornado.web
print(tornado.web.RedirectHandler.write.__name__) # write
print(tornado.web.RedirectHandler.write.__qualname__) # RequestHandler.write
对于类、模块、函数(直接在全局使用def定义)
来说,这两者没什么区别,但如果是类里面的函数的话,那么__name__
获取的还是函数名,但是__qualname__
则是包含了所在的类名(可以是多个)
。并且这个__qualname__
最多扩展到类,不会显示所在模块。
__doc__
__doc__
就很简单了,就是获取一个对象的文档注释
class A:
"""
这个是一个类
名叫class A
"""
def __init__(self):
"""
这是构造函数
"""
print(A.__doc__)
"""
这个是一个类
名叫class A
"""
print(A.__init__.__doc__)
"""
这是构造函数
"""
__doc__
会将格式原原本本地输出出来,并且,类的实例对象也是可以获取__doc__
属性的
__base__
查看一个类都继承了哪些类
class A:
pass
class B(int, A):
pass
print(B.__base__) # <class 'int'>
"""
但是我们看到__base__只显示继承的类的其中一个
那么有没有办法全部显示呢?
答案是使用__bases__
"""
print(B.__bases__) # (<class 'int'>, <class '__main__.A'>)
print(A.__base__) # <class 'object'>
print(A.__bases__) # (<class 'object'>,)
"""
我们看到,如果显式地继承了某个类,会打印继承的类的名字
如果没有,那么打印object
"""
对于__base__
和__bases__
两个魔法属性,只有类才具有。实例对象是没有的
__class__
显示一个对象类型,换句话说就是显示自己是被谁实例化的。而python中的任何对象都有__class__
属性,因为我们说python中一切皆对象,那么就必定有一个类能够实例化它。
print("".__class__) # <class 'str'>
print({}.__class__) # <class 'dict'>
print([].__class__) # <class 'list'>
print(int.__class__) # <class 'type'>
print(object.__class__) # <class 'type'>
print(type.__class__) # <class 'type'>
__module__
显示一个对象所在的模块
print(str.__module__) # builtins
from tornado.web import RedirectHandler
print(RedirectHandler.__module__) # tornado.web
import numpy
print(numpy.ndarray.__module__) # numpy
from numpy.core._multiarray_umath import ndarray
print(ndarray.__module__) # numpy
print(getattr.__module__) # builtins
类、或者在全局定义的函数具有__module__
属性,另外我们看一下numpy,我们说ndarray这个类实际上位于numpy.core._multiarray_umath
中,但是它在我们加载numpy的时候,就已经在__init__.py
中被加载进来了,所以显示的是numpy。
__dict__
这个表示属性字典,我们说类、函数、实例对象都有自己的属性字典,这个属性我个人觉得就没有必要介绍了,因为属性字典肯定都非常熟悉了
__file__
__file__
这个属性,只有模块才具有。我们这里的模块指的不单单是一个文件,一个具有多个文件的目录也可以是一个模块。在底层,单独的文件和一个目录都可以作为模块,都对应PyModuleObject对象。
import datetime
print(datetime.__file__) # C:\python38\lib\datetime.py
import tornado
print(tornado.__file__) # C:\python38\lib\site-packages\tornado\__init__.py
"""
我们说对于单独的文件所构成的模块来讲,它的__file__就是其文件所在的绝对路径
如果是目录所构成的模块,那么__file__就是内部的__init__.py的绝对路径
"""
from pandas import core
print(core.__file__) # C:\python38\lib\site-packages\pandas\core\__init__.py
# 这个时候问题来了,如果这个目录没有__init__.py文件怎么办?
import 空目录
print(空目录.__file__) # None
# 如果没有的话,那么显示的为None
另外,有一些模块属于特例,像sys、time这些内嵌在解释器里面的模块是不具备__file__
属性的。
__path__
__path__
属性还是只有模块才有,并且这个模块必须是有目录所构成的模块。我们说单独的文件和目录都可以作为模块,但是只有目录对应的模块才具有__path__
属性。
from pandas import core
print(core.__path__) # ['C:\\python38\\lib\\site-packages\\pandas\\core']
import tornado
print(tornado.__path__) # ['C:\\python38\\lib\\site-packages\\tornado']
"""
这里的__path__打印的是对应目录的绝对路径
"""
import 空目录
print(空目录.__path__) # _NamespacePath(['D:\\satori\\空目录', 'D:\\satori\\空目录'])
"""
但是该目录下必须有__init__.py文件,如果没有那么会打印_NamespacePath
"""
# 我们在里面创建一个__init__.py文件
with open("空目录/__init__.py", "w") as f:
pass
# 然后重新加载
import importlib
importlib.reload(空目录)
# 成功显示
print(空目录.__path__) # ['D:\\satori\\空目录']
详解python中的生成器表达式的更多相关文章
- 详解Python中的生成器表达式(generator expression)
介绍 1.生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列 ...
- 举例详解Python中的split()函数的使用方法
这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:sp ...
- 详解Python中re.sub--转载
[背景] Python中的正则表达式方面的功能,很强大. 其中就包括re.sub,实现正则的替换. 功能很强大,所以导致用法稍微有点复杂. 所以当遇到稍微复杂的用法时候,就容易犯错. 所以此处,总结一 ...
- 详解Python中内置的NotImplemented类型的用法
它是什么? ? 1 2 >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Pyth ...
- 详解Python中的循环语句的用法
一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...
- 详解python中@的用法
python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,‘@function'作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 ...
- Python Deque 模块使用详解,python中yield的用法详解
Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除. https://blog.csdn.net/qq_3 ...
- 详解Python中的__init__和__new__(静态方法)
一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: #-*- co ...
- 详解Python中的__new__、__init__、__call__三个特殊方法(zz)
__new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪来的self)__init__ : 对象的初始化, 是一个实例方法,第一个参数是self ...
随机推荐
- Maven 官网 查找&下载 jar包& pom引用 完美方案
Maven 官网 查找&下载 jar包 & pom引用 问题描述 在我们在开发过程中,经常遇到程序中需要引用的某个版本jar包,但是在公司的私有仓库下载不到的情况. 遇到这种情况,该怎 ...
- 20190925 - 使 macOS 的 rm 命令删除到回收站的不完美办法
今天使用 macOS 时,使用 rm 删除了一个不重要文件,为保证以后不删除重要文件,找到一个让 rm 命令更安全的办法. 使用 MacPorts 安装 rmtrash 命令. sudo port i ...
- sql绕过转义符注入
宽字节绕过总结 1. 重点:转义符反斜杠\,ASCII码0x5C 2. 在双字节字符集中, 在\前面增加高字节,0x5C被当做低字节,组合为“汉字”,导致\符号被“吃掉”,后续字符逃出限制,从而绕 ...
- 【计算机视觉】基于样本一致性的背景减除运动目标检测算法(SACON)
SACON(SAmple CONsensus)算法是基于样本一致性的运动目标检测算法.该算法通过对每个像素进行样本一致性判断来判定像素是否为背景. 算法框架图 由上图可知,该算法主要分为四个主要部分, ...
- PTA(Advanced Level)1075.PAT Judge
The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...
- 分布式系统/NoSQL
分布式系统概念与架构:https://www.cnblogs.com/JonaLin/category/1555338.html 分布式缓存 redis系列:https://blog.csdn.net ...
- 同步锁 死锁与递归锁 信号量 线程queue event事件
二个需要注意的点: 1 线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock任然没有被释放则阻塞,即便是拿到执行权限GIL也要 ...
- raspberrypi 树莓派 内核编译
相关版本信息 硬件:树莓派 2b 目标系统: linux 编译环境:ubuntu 14.4 32bit 用户路径:/home/hi/ 安装交叉编译链 cdmkdir pi/kernelcd pi/ke ...
- WebMvcConfigurationSupport跨域和fastjson全局替换
@Configuration public class WarnWebMvcConfigurationSupport extends WebMvcConfigurationSupport { /** ...
- Codeforces 1244E. Minimizing Difference
传送门 首先减的顺序是无关紧要的,那么有一个显然的贪心 每次减都减最大或者最小的,因为如果不这样操作,最大的差值不会变小 那么直接把序列排序一下然后模拟一下操作过程即可,别一次只减 $1$ 就好 #i ...