Linux操作系统具都有哪些特点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux操作系统具都有哪些特点相关的知识,希望对你有一定的参考价值。
很急啊,请大家帮帮忙啊!
LINUX系统的主要特点。\x0d\x0a1、开放性:特别是遵循开放系统互连(OSI)国际标准。\x0d\x0a2、多用户:操作系统资源可以被不同用户使用,每个用户对自己的资源(例如:文件、设备)有特定的权限,互不影响。\x0d\x0a3、多任务:计算机同时执行多个程序,而同时各个程序的运行互相独立。\x0d\x0a4、良好的用户界面:Linux向用户提供了两种界面:用户界面和系统调用。Linux还为用户提供了图形用户界面。它利用鼠标、菜单、窗口、滚劢条等设施,给用户呈现一个直观、易操作、交互性强的友好的图形化界面。\x0d\x0a5、设备独立性:操作系统把所有外部设备统一当作成文件来看待,只要安装驱劢程序,任何用户都可以象使用文件一样,操纵、使用这些设备。Linux是具有设备独立性的操作系统,内核具有高度适应能力。\x0d\x0a6、提供了丰富的网络功能:完善的内置网络是Linux一大特点。\x0d\x0a7、可靠的安全系统:Linux采取了许多安全技术措施,包括对读、写控制、带保护的子系统、审计跟踪、核心授权等,这为网络多用户环境中的用户提供了必要的安全保障。\x0d\x0a8、良好的可移植性:将操作系统从一个平台转移到另一个平台使它仍然能_其自身的方式运行的能力。Linux是一种可移植的操作系统,能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。 参考技术A 一、 Linux的诞生Linux的兴起可以说是Internet创造的一个奇迹。 1991年初,当年轻的芬兰大学生Linus Torvalds在开始其Linux 操作系统的设计时,他的目的只不过是想看一看Intel 386存储 管理硬件是怎样工作的,而绝对没有想到这一举动会在计算机界 产生如此重大的影响。他的设计进展得很顺利,只花了几个月时 间就在一台Intel 386微机上完成了一个类似于Unix 的操作系统, 这就是最早的Linux版本。1991年底,Linus Torvalds首次在Internet 上发布了基于Intel 386体系结构的Linux源代码,从此以后,奇迹开始 发生了。由于Linux具有结构清晰、功能简捷等特点,许多大专院校的学 生和科研机构的研究人员纷纷把它作为学 习和研究的对象。他们在更正原 有Linux版本中错误的同时,也不断地为Linux增加新的功能。在众多热心者的 努力下,Linux逐渐成为一个稳定可靠、功能完善的操作系统。一些软件公司, 如Red Hat、InfoMagic等也不失时机地推出了自己的以Linux为核心的操作系统 版本,这大大推动了Linux的商品化。在一些大的计算机公司的支持下,Linux还 被移植到以Alpha APX、PowerPC、Mips及Sparc等为处理机的系统上。Linux的使 用日益广泛,其影响力直逼Unix。
Linux的成功得益于如下因素:
(1) 具有良好的开放性。Linux及其生成工具的源代码均可通过Internet免费获取,linux爱 好者能非常 容易地建立一个Linux开发平台。
(2) Internet的普及使热心于Linux的开发者们能进行高效、快捷的交流,从而为Linux 创造了一个优良的分布式开发环境。
(3) Linux具有很强的适应性,能适应各种不同的硬件平台。
Linux的版本更新很快。在短短的七年时间里,其版本已升至2.1.x。这里之所以用"x"表示,是因为 x的值变化太快,很难准确地定位它的值。这也从侧面反映了从事Linux的研究者之多。不过,Linux用得最 多的版本还是2.0.30,许多商品化的操作系统都以它为核心。
二、 Linux的主要特点
作为一个操作系统,Linux几乎满足当今Unix操作系统的所有要求,因此,它具有Unix操作系统的基本 特征。
1.符合POSIX 1003.1标准
POSIX 1003.1标准定义了一个最小的Unix操作系统接口,任何操作系统只有符合这一标准,才有可能运 行Unix程序。考虑到Unix具有丰富的应用程序,当今绝大多数操作系统都把满足POSIX 1003.1标准作为实现 目标,Linux也不例外,它完全支持POSIX 1003.1标准。另外,为了使Unix System V和BSD上的程序能直接在 Linux上运行, Linux还增加了部分System V和BSD的系统接口,使Linux成为一个完善的Unix程序开发系统。
2.支持多用户访问和多任务编程
Linux是一个多用户操作系统,它允许多个用户同时访问系统而不会造成用户之间的相互干扰。另外, Linux还支持真正的多用户编程,一个用户可以创建多个进程,并使各个进程协同工作来完成用户的需求.
3.采用页式存储管理
页式存储管理使Linux能更有效地利用物理存储空间,页面的换入换出为用户提供了更大的存储空间。
4.支持动态链接
用户程序的执行往往离不开标准库的支持,一般的系统往往采用静态链接方式,即在装配阶段就已将 用户程序和标准库链接好,这样,当多个进程运行时,可能会出现库代码在内存中有多个副本而浪费存储 空间的情况。Linux 支持动态链接方式,当运行时才进行库链接,如果所需要的库已被其它进程装入内存, 则不必再装入,否则才从硬盘中将库调入。这样能保证内存中的库程序代码是唯一的。
5.支持多种文件系统
Linux能支持多种文件系统。目前支持的文件系统有:EXT2、EXT、XIAFS、ISOFS、HPFS、MSDOS、UMSDOS、 PROC、NFS、SYSV、MINIX、SMB、UFS、NCP、VFAT、AFFS。Linux最常用的文件系统是EXT2,它的文件名长度可 达255字符,并且还有许多特有的功能,使它比常规的Unix文件系统更加安全。
6.支持TCP/IP、SLIP和PPP
在Linux中,用户可以使用所有的网络服务,如网络文件系统、远程登录等。SLIP和PPP能支持串行线上的 TCP/IP协议的使用,这意味着用户可用一个高速Modem通过电话线连入Internet网中。
除了上述基本特征外,Linux还具有其独有的特色:
支持硬盘的动态Cache 这一功能与MS�DOS中的Smartdrive相似。所不同的是,Linux能动态调整所用的 Cache存储器的大小,以适合当前存储器的使用情况,当某一时刻没有更多的存储空间可用时,Cache将被减少, 以增加空闲的存储空间,一旦存储空间不再紧张,Cache的大小又将增加。
支持不同格式的可执行文件 Linux具有多种模拟器,这使它能运行不同格式的目标文件。其中,DOS和 MS�Windows正在开发之中,iBCS2模拟器能运行SCO Unix的目标程序。(iBCS2 模拟器不是Linux标准核心的 一部分,但可从ftp.informatik.hu�berlin.de:/pub/os/linux下载)
三、 Linux的主要构成
Linux主要由存储管理、进程管理、文件系统、进程间通信等几部分组成,在许多算法及实现策略上, Linux借鉴了Unix的成功经验,但也不乏自己的特色。
1.存储管理
Linux采用页式存储管理机制,每个页面的大小随处理机芯片而异。例如,Intel 386处理机页面大小 可为4KB和2MB两种,而Alpha处理机页面大小可为8KB、16KB、32KB和64KB。页面大小的选择对地址变换算 法和页表结构会有一定的影响,如Alpha的虚地址和物理地址的有效长度随页面尺寸的变化而变化,这种变 化必将在地址变换和页表项中有所反映。
在Linux中,每一个进程都有一个比实际物理空间大得多的进程虚拟空间,为了建立虚拟空间和物理空 间之间的映射,每个进程还保留一张页表,用于将本进程空间中的虚地址变换成物理地址。页表还对物理页 的访问权限作出了规定,定义了哪些页可读写,哪些页是只读页,在进行虚实变换时,Linux将根据页表中规 定的访问权限来判定进程对物理地址的访问是否合法,从而达到存储保护的目的。
Linux存储空间分配遵循的是不到有实际需要的时候决不分配物理空间的原则。当一个程序加载执行时, Linux只为它分配了虚空间,只有访问某一虚地址而发生了缺页中断时,才为它分配物理空间,这样就可能 出现某些程序运行完成后,其中的一些页从来就没有装进过内存。这种存储分配策略带来的好处是显而易见的,因为它最大限度地利用了物理存储器。
尽管Linux对物理存储器资源的使用十分谨慎,但还是经常出现物理存储器资源短缺的情况。Linux有一 个名为kswapd的进程专门负责页面的换出,当系统中的空闲页面小于一定的数目时,kswapd将按照一定的淘 汰算法选出某些页面,或者直接丢弃(页面未作修改),或者将其写回硬盘(页面已被修改)。这种换出方式不 同于较旧版本Unix的换出方式,它是将一个进程的所有页全部写回硬盘。相比之下,Linux的效率更高。
2.进程管理
在Linux中,进程是资源分配的基本单位,所有资源都是以进程为对象来进行分配的。 在一个进程的生 命期内,它会用到许多系统资源,会用CPU运行其指令,用存储器存储其指令和数据,它也会打开和使用文件 系统中的文件,直接或间接用到系统中的物理设备,因此,Linux设计了一系列的数据结构,它们能准确地描 述进程的状态和其资源使用情况,以便能公平有效地使用系统资源。Linux的调度算法能确保不出现某些进程 过度占用系统资源而导致另一些进程无休止地等待的情况。
进程的创建是一个十分复杂的过程,通常的做法需为子进程重新分配物理空间,并把父进程空间的内容全 盘复制到子进程空间中,其开销非常大。为了降低进程创建的开销,Linux采用了Copy�on�write技术,即不 拷贝父进程的空间,而是拷贝父进程的页表,使父进程和子进程共享物理空间,并将这个共享空间的访问权限 置为只读。当父进程和子进程的某一方进行写操作时,Linux检测到一个非法操作,这时才将要写的页进行复制 。这一做法免除了只读页的复制,从而降低了开销。
Linux目前尚未提供用户级线程,但提供了核心级线程,核心线程的创建是在进程创建的基础上稍做修改, 使创建的子进程与父进程共享虚存空间。从这一意义上讲,核心线程更像一个共享进程组。
3.文件系统
Linux最重要的特征之一就是支持多个不同的文件系统,前面我们已经看到,Linux目前支持的文件系统 多达十余种,随着时间的推移,这一数目还在不断增加。在Linux中,一个分离的文件系统不是通过设备标识 (如驱动器号或驱动器名)来访问,而是 把它合到一个单一的目录树结构中,通过目录来访问,这一点与Unix十分相似。Linux用 安装命令将一个新的文件系统安装到系统单一目录树的某一目录下,一旦安装成功,该目录下的所有内容将 被新安装的文件系统所覆盖,当文件系统被卸下后,安装目录下的文件将会被重新恢复。
Linux最初的文件系统是Minix。该文件系统对文件限制过多,并且性能低下,如文件名长度不能超过14 个字符、文件大小不能超过64MB。为了解决这些问题,Linux的开发者们设计了一个Linux专用的文件系统EXT。 EXT对文件的要求放松了许多,但在性能上并没有大的改观,于是就有了后面的EXT2文件系统。EXT2文件系统 是一个非常成功的文件系统,它无论是对文件的限制还是在性能方面都大大优于EXT文件系统,所以,EXT2自 从推出就一直是Linux最常用的文件系统。
为了支持多种文件系统,Linux用一个被称为虚拟文件系统(VFS)的接口层将真正的文件系统同操作系统及 系统服务分离开。VFS掩盖了不同文件系统之间的差异,使所有文件系统在操作系统和用户程序看来都是等同的。VFS允许用户同时透明地安装多个不同的文件系统。
4.进程间通信
Linux提供了多种进程间的通信机制,其中,信号和管道是最基本的两种。除此以外,Linux也提供 System V的进程间通信机制,包括消息队列、信号灯及共享内存。为了支持不同机器之间的进程通信, Linux还引入了BSD的Socket机制。
四、 Linux的不足及发展趋势
Linux从出现到现今只经历了短短七年的时间,但其发展速度是惊人的,这与它的开放性和优良的性能 是密不可分的。不过我们应该看到,作为一个由学生开发的系统,Linux还有许多先天不足,它的设计思想 过多地受到传统操作系统的约束,没有体现出当今操作系统的发展潮流,具体表现在以下几个方面:
不是一个微内核操作系统;
是一个分布式操作系统;
不是一个安全的操作系统;
没有用户线程;
不支持实时处理;
代码是用C而不是C++这样的现代程序设计语言编写的。
尽管Linux有这样和那样的不足,但其发展潜力不容低估,其发展的动力就是遍布全球、为数众多的 Linux热心者。今后Linux将会朝着完善功能、提高效率的方向发展,包括允许用户创建线程、增加实时处 理功能、开发适合多处理机体系结构的版本。我们相信,Linux、Unix及NT三足鼎立的时代将为期不远。
参考资料:http://www.huihoo.com/gnu_linux/linux.htm
参考技术B 简单的说,Linux是Unix克隆(Unix clone)或Unix风格(Unix alike)的操作系统(OS),在原代码级上兼容绝大部分Unix标准(指的是IEEE POSIX,System V,BSD),是一个支持多用户, 多进程,多线程,实时性较好的功能 强大而稳定的操作系统.它可以运行x86PC,Sun Sparc,Digital Alpha,680x0,PowerPC, MIPS等平台上,可 以说Linux是目前运行硬件平台最多的操作系统. Linux最大的特点在于它是GNU(Gnu's Not Unix----有点分形与混沌的意味----无限自包含,简单的说GNU是一种自由软件体系)的一员,遵循公共版权许可证(GPL),秉承 "自由的思想,开放的源码"的原则,成千上万的专家/爱好者通过Internet在不断地完善并维护它,可以说Linux是计算机爱好者自己的操作系统. 追述Linux的历史直到1990年,Linus Torvalds还是芬兰赫尔辛基大学的一名学生,最初是用汇编语言写了一个在80386保护模式下处理多任务切换的程序,后来从Minix(Andy Tanenbaum教授所写的很小的Unix操作系统,主要用于操作系统教学)得到灵感,进一步产生了自认为狂妄的想法----写一个比Minix更好的Minix,于是开始写了一些硬件的设备驱动程序,一个小的文件系统,......,这样0.0.1版本的Linux就出来了,但是它只具有操作系统内核的勉强的雏形,甚至不能运行,你必须在有Minix的机器上编译以后才能玩.这时候 Linus已经完全着迷而不想停止,决定踢开Minix,于是在1991年10 月5号发布Linux 0.0.2版本,在这个版本中已经可以运行bash(the GNU Bourne Again Shell----一种用户与操作系统内核通讯的软件)和gcc(GNU C 编译器).从一开始,Linus就决定自由扩散Linux,包括原代码,他在comp.os.minix新闻讨论组里发布Linux 0.0.2时写到:"Do you pine for nice days of Minix-1.1, when mem were men and wrote their own device drivers? Are you without a niceproject and just dying to cut your teeth on a OS you can try to modify for your needs? Are you finding it frustrsting when everything works on Minix? No more all-nighters to get a nifty program working? Then this post might be just for you.
"As I mentioned a month ago, I'm working on a free version of a Minix-lookalike for AT-386 computers. It has finally reached the stage where it's even usable(though may not be depending on what you want),and I am willing to put out the sources for wider distribution. It is just version 0.0.2 ... but I've successfully run bash,gcc,gnu-make,gnu-sed,compress,etc.under it."
随即Linux引起黑客们(hacker)的注意,通过计算机网络加入了Linux的内核开发,Linux倾向于成为一个黑客的系统----直到今天,在Linux社区里内核的开发被认为是真正的编程.由于一批高水平黑客的加入,使Linux发展迅猛,到1993年底94年初,Linux 1.0终于诞生了! Linux 1.0已经是一个功能完备的操作系统,而且内核写得紧凑高效,可以充分发挥硬件的性能,在4M内存的80386机器上也表现得非常好,至今人们还在津津乐道于此,不过自从2.1.xx系列的内核Linux开始走高端的路子----硬件的发展太快了,但是Linux不会失去它的本色.Linux具有良好的兼容性和可移植性,大约在1.3版本之后,开始向其他硬件平台上移植,包括号称最快的CPU---Digital Alpha(至少目前主频是最高的).所以不要总把Linux与低档硬件平台联系 到一块,Linux发展到今天,这是一个误区,它只是将硬件的性能充分发挥 出来而已,Linux必将从低端应用横扫到高端应用!
在Linux的发展历程上还有一件重要的事:Linux加入GNU并遵循公共版权许可证(GPL).此举大大加强了GNU和Linux,几乎所有应用的GNU库/软件都移植到Linux,完善并提高了Linux的实用性,而GNU有了一个根基,我现在也搞不清楚到底是GNU Linux呢还是基于Linux的GNU. :-) 更重要的是遵循公共版权许可证,在继承自由软件的精神的前提下,不再排斥对自由软件的商业行为(如把自由软件打包以光盘形式出售),不排斥商家对自由软件进一步开发,不排斥在Linux上开发商业软件.从此Linux又开始了一次飞跃,出现了很多的Linux发行版 ,如Slackware,Redhat,Suse,TurboLinux,OpenLinux等十多种,而且 还在增加,注意你不能说"Redhat Linux""Suse Linux""Slackware Linux"等等,Linux主要指操作系统内核,对所有发行版内核原代码都是一样的(但集成的内核版本可能因发行时间不同而有所不同). 还有一些公司在Linux上开发商业软件或把其他Unix平台的软件移植到Linux上来,如今很多IT业界的大腕如IBM,Intel,Oracle,Infomix,Sysbase,Corel,Netscape,CA,Novell等都宣布支持Linux! 商家的加盟弥补了纯自由软件的不足和发展障碍,Linux迅速普及到广大计算机爱好者,并且进入商业应用,正是打破某些公司垄断文化圈的希望所在!!
Linux是爱好者们通过Internet协同开发出来的,当然它的网络功能十分强大,比如你可以通过ftp,nfs等来安装Linux,用它来做网关等等.随着Linux的发展衍生出来的应用恐怕出乎Linus本人最初的预料,如有人用它来做路由器,有人来做嵌入式系统,有人来做实时性系统. .....常有新手问Linux能做什么,其实它不象那些中看不中用的操作系统,不在于你用它能干什么,而在于你想干什么! Linux的兴起还给人们很多启迪与思考,如集市式软件开发的讨论, 又如自由软件的精神...... 参考技术C 简单的说,Linux是Unix克隆(Unix clone)或Unix风格(Unix alike)的操作系统(OS),在原代码级上兼容绝大部分Unix标准(指的是IEEE POSIX,System V,BSD),是一个支持多用户, 多进程,多线程,实时性较好的功能 强大而稳定的操作系统.它可以运行x86PC,Sun Sparc,Digital Alpha,680x0,PowerPC, MIPS等平台上,可 以说Linux是目前运行硬件平台最多的操作系统. Linux最大的特点在于它是GNU(Gnu's Not Unix----有点分形与混沌的意味----无限自包含,简单的说GNU是一种自由软件体系)的一员,遵循公共版权许可证(GPL),秉承 "自由的思想,开放的源码"的原则,成千上万的专家/爱好者通过Internet在不断地完善并维护它,可以说Linux是计算机爱好者自己的操作系统. 追述Linux的历史直到1990年,Linus Torvalds还是芬兰赫尔辛基大学的一名学生,最初是用汇编语言写了一个在80386保护模式下处理多任务切换的程序,后来从Minix(Andy Tanenbaum教授所写的很小的Unix操作系统,主要用于操作系统教学)得到灵感,进一步产生了自认为狂妄的想法----写一个比Minix更好的Minix,于是开始写了一些硬件的设备驱动程序,一个小的文件系统,......,这样0.0.1版本的Linux就出来了,但是它只具有操作系统内核的勉强的雏形,甚至不能运行,你必须在有Minix的机器上编译以后才能玩.这时候 Linus已经完全着迷而不想停止,决定踢开Minix,于是在1991年10 月5号发布Linux 0.0.2版本,在这个版本中已经可以运行bash(the GNU Bourne Again Shell----一种用户与操作系统内核通讯的软件)和gcc(GNU C 编译器).从一开始,Linus就决定自由扩散Linux,包括原代码,他在comp.os.minix新闻讨论组里发布Linux 0.0.2时写到:
"Do you pine for nice days of Minix-1.1, when mem were men and wrote their own device drivers? Are you without a niceproject and just dying to cut your teeth on a OS you can try to modify for your needs? Are you finding it frustrsting when everything works on Minix? No more all-nighters to get a nifty program working? Then this post might be just for you.
"As I mentioned a month ago, I'm working on a free version of a Minix-lookalike for AT-386 computers. It has finally reached the stage where it's even usable(though may not be depending on what you want),and I am willing to put out the sources for wider distribution. It is just version 0.0.2 ... but I've successfully run bash,gcc,gnu-make,gnu-sed,compress,etc.under it."
随即Linux引起黑客们(hacker)的注意,通过计算机网络加入了Linux的内核开发,Linux倾向于成为一个黑客的系统----直到今天,在Linux社区里内核的开发被认为是真正的编程.由于一批高水平黑客的加入,使Linux发展迅猛,到1993年底94年初,Linux 1.0终于诞生了! Linux 1.0已经是一个功能完备的操作系统,而且内核写得紧凑高效,可以充分发挥硬件的性能,在4M内存的80386机器上也表现得非常好,至今人们还在津津乐道于此,不过自从2.1.xx系列的内核Linux开始走高端的路子----硬件的发展太快了,但是Linux不会失去它的本色.Linux具有良好的兼容性和可移植性,大约在1.3版本之后,开始向其他硬件平台上移植,包括号称最快的CPU---Digital Alpha(至少目前主频是最高的).所以不要总把Linux与低档硬件平台联系 到一块,Linux发展到今天,这是一个误区,它只是将硬件的性能充分发挥 出来而已,Linux必将从低端应用横扫到高端应用!
在Linux的发展历程上还有一件重要的事:Linux加入GNU并遵循公共版权许可证(GPL).此举大大加强了GNU和Linux,几乎所有应用的GNU库/软件都移植到Linux,完善并提高了Linux的实用性,而GNU有了一个根基,我现在也搞不清楚到底是GNU Linux呢还是基于Linux的GNU. :-) 更重要的是遵循公共版权许可证,在继承自由软件的精神的前提下,不再排斥对自由软件的商业行为(如把自由软件打包以光盘形式出售),不排斥商家对自由软件进一步开发,不排斥在Linux上开发商业软件.从此Linux又开始了一次飞跃,出现了很多的Linux发行版 ,如Slackware,Redhat,Suse,TurboLinux,OpenLinux等十多种,而且 还在增加,注意你不能说"Redhat Linux""Suse Linux""Slackware Linux"等等,Linux主要指操作系统内核,对所有发行版内核原代码都是一样的(但集成的内核版本可能因发行时间不同而有所不同). 还有一些公司在Linux上开发商业软件或把其他Unix平台的软件移植到Linux上来,如今很多IT业界的大腕如IBM,Intel,Oracle,Infomix,Sysbase,Corel,Netscape,CA,Novell等都宣布支持Linux! 商家的加盟弥补了纯自由软件的不足和发展障碍,Linux迅速普及到广大计算机爱好者,并且进入商业应用,正是打破某些公司垄断文化圈的希望所在!!
Linux是爱好者们通过Internet协同开发出来的,当然它的网络功能十分强大,比如你可以通过ftp,nfs等来安装Linux,用它来做网关等等.随着Linux的发展衍生出来的应用恐怕出乎Linus本人最初的预料,如有人用它来做路由器,有人来做嵌入式系统,有人来做实时性系统. .....常有新手问Linux能做什么,其实它不象那些中看不中用的操作系统,不在于你用它能干什么,而在于你想干什么! Linux的兴起还给人们很多启迪与思考,如集市式软件开发的讨论, 又如自由软件的精神...... 参考技术D Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。
查找 Python 对象具都有哪些方法
【中文标题】查找 Python 对象具都有哪些方法【英文标题】:Finding what methods a Python object has查找 Python 对象具有哪些方法 【发布时间】:2010-09-07 06:14:07 【问题描述】:给定一个任何类型的 Python 对象,是否有一种简单的方法可以获取该对象具有的所有方法的列表?
或者,
如果这不可能,除了简单地检查调用方法时是否发生错误之外,是否至少有一种简单的方法可以检查它是否具有特定的方法?
【问题讨论】:
相关:***.com/q/46033277/1959808 您可以使用 dir(object) 将所有这些都放在一个列表中 【参考方案1】:对于许多对象,您可以使用此代码,将“object”替换为您感兴趣的对象:
object_methods = [method_name for method_name in dir(object)
if callable(getattr(object, method_name))]
我在diveintopython.net 发现了它(现已存档)。希望这应该提供更多细节!
如果您收到AttributeError
,则可以改用它:
getattr(
不能容忍 pandas 风格的 python3.6 抽象虚拟子类。这段代码和上面一样,忽略异常。
import pandas as pd
df = pd.DataFrame([[10, 20, 30], [100, 200, 300]],
columns=['foo', 'bar', 'baz'])
def get_methods(object, spacing=20):
methodList = []
for method_name in dir(object):
try:
if callable(getattr(object, method_name)):
methodList.append(str(method_name))
except:
methodList.append(str(method_name))
processFunc = (lambda s: ' '.join(s.split())) or (lambda s: s)
for method in methodList:
try:
print(str(method.ljust(spacing)) + ' ' +
processFunc(str(getattr(object, method).__doc__)[0:90]))
except:
print(method.ljust(spacing) + ' ' + ' getattr() failed')
get_methods(df['foo'])
【讨论】:
这是一个列表推导,返回一个方法列表,其中 method 是 dir(object) 返回的列表中的一项,并且只有 getattr(object,method) 才会将每个方法添加到列表中返回一个可调用对象。 你是如何使用这个的?要说打印方法列表。 @marsh 打印方法:print [method for method in dir(object) if callable(getattr(object, method))]
.
当我尝试运行它时,我收到了一个AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'
。在***.com/q/54713287/9677043查看详细信息。
不适用于 python 3.6 中的 pandas 数据框对象。【参考方案2】:
您可以使用内置的dir()
函数来获取模块具有的所有属性的列表。在命令行中尝试一下,看看它是如何工作的。
>>> import moduleName
>>> dir(moduleName)
此外,您可以使用hasattr(module_name, "attr_name")
函数来确定模块是否具有特定属性。
请参阅Guide to Python introspection 了解更多信息。
【讨论】:
hasattr
帮助我的用例查找 python 对象是否具有特定的成员变量或方法。
我不确定为什么这个解决方案没有得到足够的支持。这是简洁而准确的。
由于 dir() 返回一个列表,我们可以使用'attrib_name' in dir(moduleName)
来查找模块是否具有特定属性。【参考方案3】:
最简单的方法是使用dir(objectname)
。它将显示该对象可用的所有方法。很酷的把戏。
【讨论】:
它也显示了对象的属性,所以如果你想专门找方法是不行的。 是的。同意。但是,我不知道任何其他仅获取方法列表的技术。也许最好的办法是获取属性和方法的列表,然后使用AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'
。有任何想法吗?请参阅***.com/q/54713287/9677043 的 deets。 +1 给@Pawan Kumar b/c 答案是有效的,并给@ljs 以保证只包含方法的过滤列表。【参考方案4】:
我相信你想要这样的东西:
对象的属性列表
内置函数dir()
可以完成这项工作。
取自 Python shell 上的 help(dir)
输出:
目录(...)
dir([object]) -> list of strings
如果在没有参数的情况下调用,则返回当前范围内的名称。
否则,返回一个按字母顺序排列的名称列表,其中包括给定对象的(部分)属性以及可从该对象访问的属性。
如果对象提供了一个名为
对于模块对象:模块的属性。 对于一个类对象:它的属性,以及它的基类的递归属性。 对于任何其他对象:其属性、其类的属性以及递归其类的基类的属性。__dir__
的方法,它将被使用;否则 使用默认的 dir() 逻辑并返回:
例如:
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "I am a string"
>>>
>>> type(a)
<class 'str'>
>>>
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize',
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip',
'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
'translate', 'upper', 'zfill']
【讨论】:
【参考方案5】:检查它是否有特定的方法:
hasattr(object,"method")
【讨论】:
由于 OP 正在寻找一种方法而不仅仅是和属性,我认为您想更进一步:if hasattr(obj,method) and callable(getattr(obj,method)):
【参考方案6】:
除了更直接的答案之外,如果我不提及IPython,我将失职。
点击 Tab 以查看可用的方法,并自动完成。
一旦你找到了方法,就试试吧:
help(object.method)
查看 pydocs、方法签名等
啊……REPL.
【讨论】:
【参考方案7】:获取任何对象的方法列表的最简单方法是使用help()
命令。
help(object)
它将列出与该对象关联的所有可用/重要方法。
例如:
help(str)
【讨论】:
%
在第一个示例中做了什么?它在我的 Python 2.7 中不起作用。
@Scorchio 我使用“%”作为提示符,而不是“>>>”用于 python。你可以在运行命令之前去掉 %。【参考方案8】:
如果你特别想要方法,你应该使用inspect.ismethod。
对于方法名称:
import inspect
method_names = [attr for attr in dir(self) if inspect.ismethod(getattr(self, attr))]
对于方法本身:
import inspect
methods = [member for member in [getattr(self, attr) for attr in dir(self)] if inspect.ismethod(member)]
有时inspect.isroutine
也很有用(对于内置、C 扩展、没有“绑定”编译器指令的 Cython)。
【讨论】:
你不应该在列表理解中使用inspect.getmembers
而不是dir
吗?
是的,这似乎更好!
inspect.getmembers(self, predicate=inspect.ismethod)
?【参考方案9】:
假设我们有一个 Python obj
。然后看看它所有的方法,包括__
(magic methods)包围的方法:
print(dir(obj))
要排除内置的魔法,可以这样做:
[m for m in dir(obj) if not m.startswith('__')]
【讨论】:
【参考方案10】:打开一个 Bash shell(在 Ubuntu 上是 Ctrl + Alt + T)。在其中启动 Python 3 shell。创建一个对象来观察方法。只需在其后添加一个点,然后按两次 Tab,您会看到如下内容:
user@note:~$ python3
Python 3.4.3 (default, Nov 17 2016, 01:08:31)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import readline
>>> readline.parse_and_bind("tab: complete")
>>> s = "Any object. Now it's a string"
>>> s. # here tab should be pressed twice
s.__add__( s.__rmod__( s.istitle(
s.__class__( s.__rmul__( s.isupper(
s.__contains__( s.__setattr__( s.join(
s.__delattr__( s.__sizeof__( s.ljust(
s.__dir__( s.__str__( s.lower(
s.__doc__ s.__subclasshook__( s.lstrip(
s.__eq__( s.capitalize( s.maketrans(
s.__format__( s.casefold( s.partition(
s.__ge__( s.center( s.replace(
s.__getattribute__( s.count( s.rfind(
s.__getitem__( s.encode( s.rindex(
s.__getnewargs__( s.endswith( s.rjust(
s.__gt__( s.expandtabs( s.rpartition(
s.__hash__( s.find( s.rsplit(
s.__init__( s.format( s.rstrip(
s.__iter__( s.format_map( s.split(
s.__le__( s.index( s.splitlines(
s.__len__( s.isalnum( s.startswith(
s.__lt__( s.isalpha( s.strip(
s.__mod__( s.isdecimal( s.swapcase(
s.__mul__( s.isdigit( s.title(
s.__ne__( s.isidentifier( s.translate(
s.__new__( s.islower( s.upper(
s.__reduce__( s.isnumeric( s.zfill(
s.__reduce_ex__( s.isprintable(
s.__repr__( s.isspace(
【讨论】:
虽然我们正在讨论这样的解决方法,但我要补充一点,您也可以运行ipython
,开始输入对象并按tab
,它也可以正常工作。无需读取行设置
@MaxCoplan 我已经在代码中添加了默认情况下不启用制表符补全的解决方法【参考方案11】:
这里指出的所有方法的问题是您不能确定某个方法不存在。
在 Python 中,您可以通过__getattr__
和__getattribute__
拦截点调用,从而可以“在运行时”创建方法
例子:
class MoreMethod(object):
def some_method(self, x):
return x
def __getattr__(self, *args):
return lambda x: x*2
如果执行的话,可以调用对象字典中不存在的方法...
>>> o = MoreMethod()
>>> o.some_method(5)
5
>>> dir(o)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'some_method']
>>> o.i_dont_care_of_the_name(5)
10
这就是您在 Python 中使用 Easier to ask for forgiveness than permission 范式的原因。
【讨论】:
【参考方案12】:没有可靠的方法来列出所有对象的方法。 dir(object)
通常很有用,但在某些情况下它可能不会列出所有方法。根据dir()
documentation:“使用参数,尝试返回该对象的有效属性列表。”
检查方法是否存在可以由callable(getattr(object, method))
完成,正如那里已经提到的那样。
【讨论】:
【参考方案13】:import moduleName
for x in dir(moduleName):
print(x)
这应该工作:)
【讨论】:
【参考方案14】:可以创建一个getAttrs
函数,该函数将返回对象的可调用属性名称
def getAttrs(object):
return filter(lambda m: callable(getattr(object, m)), dir(object))
print getAttrs('Foo bar'.split(' '))
那会回来的
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__iadd__', '__imul__', '__init__',
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__',
'__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__',
'__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop',
'remove', 'reverse', 'sort']
【讨论】:
【参考方案15】:以列表为对象
obj = []
list(filter(lambda x:callable(getattr(obj,x)),obj.__dir__()))
你得到:
['__add__',
'__class__',
'__contains__',
'__delattr__',
'__delitem__',
'__dir__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__getitem__',
'__gt__',
'__iadd__',
'__imul__',
'__init__',
'__init_subclass__',
'__iter__',
'__le__',
'__len__',
'__lt__',
'__mul__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__reversed__',
'__rmul__',
'__setattr__',
'__setitem__',
'__sizeof__',
'__str__',
'__subclasshook__',
'append',
'clear',
'copy',
'count',
'extend',
'index',
'insert',
'pop',
'remove',
'reverse',
'sort']
【讨论】:
【参考方案16】:...除了简单地检查调用方法时是否发生错误之外,是否至少有一种简单的方法可以检查它是否具有特定的方法
虽然“Easier to ask for forgiveness than permission”当然是 Pythonic 方式,但您可能正在寻找:
d='foo':'bar', 'spam':'eggs'
if 'get' in dir(d):
d.get('foo')
# OUT: 'bar'
【讨论】:
【参考方案17】:我已经完成了以下函数(get_object_functions
),它接收一个对象(object_
)作为其参数,返回一个包含所有方法(包括静态和类)的列表(functions
)方法)在对象的类中定义:
def get_object_functions(object_):
functions = [attr_name
for attr_name in dir(object_)
if str(type(getattr(object_,
attr_name))) in ("<class 'function'>",
"<class 'method'>")]
return functions
好吧,它只是检查类属性类型的字符串表示是否等于"<class 'function'>"
或"<class 'method'>"
,然后如果是True
,则将该属性包含在functions
列表中。
演示
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f'My name is self.name')
@staticmethod
def say_hi():
print('hi')
@classmethod
def reproduce(cls, name):
return cls(name, 0)
person = Person('Rafael', 27)
print(get_object_functions(person))
输出
['__init__', 'introduce', 'reproduce', 'say_hi']
对于更简洁的代码版本: https://github.com/revliscano/utilities/blob/master/get_object_functions/object_functions_getter.py
【讨论】:
【参考方案18】:为了在整个模块中搜索特定的方法
for method in dir(module) :
if "keyword_of_methode" in method :
print(method, end="\n")
【讨论】:
【参考方案19】:例如,如果您正在使用 shell plus,则可以改用它:
>> MyObject??
那样,用 '??'就在您的对象之后,它会向您显示该类具有的所有属性/方法。
【讨论】:
什么是"shell plus"?【参考方案20】:您可以使用 Python 中预定义的 dir()。
import module_name
dir(module_name)
您也可以将对象传递给 dir()
dir(object_name)
如果对象是预定义类的对象,例如 int、str 等。它会显示其中的方法(您可能知道这些方法是内置函数)。如果该对象是为用户定义的类创建的,它会显示该类中给出的所有方法。
【讨论】:
【参考方案21】:这是一个不错的衬线(但也会获得属性):
print(*dir(obj), sep='\n')
【讨论】:
【参考方案22】:大多数时候,我希望看到用户定义的方法,而不希望看到以'__'开头的内置属性,如果您愿意,可以使用以下代码:
object_methods = [method_name for method_name in dir(object) if callable(getattr(object, method_name)) and '__' not in method_name]
例如,对于这个类:
class Person:
def __init__(self, name):
self.name = name
def print_name(self):
print(self.name)
上面的代码将打印:['print_name']
【讨论】:
以上是关于Linux操作系统具都有哪些特点的主要内容,如果未能解决你的问题,请参考以下文章