当前位置:首页 » 编程语言 » 自省python

自省python

发布时间: 2022-06-12 00:32:18

python中的函数和类的区别

楼上说错了哦,类可以有类方法(查查什么是classmethod),不需实例化也可以使用的。python的类和函数的区别主要在于类可以有变量和各种方法,而函数没有。函数只能被运行,返回或者不返回值都可以。模块如果没有把类声明为私有,其他模块就可以使用这个类,方法是import这个模块,然后用"模块名.类名"来调用。

② Python如何快速实现分布式任务

给个最简单的方案。
1. Pickle和Marshal可以序列化简单的Python对象,甚至source也可以通过各种自省方法获得。
2. 随便找一个Web框架都可以实现一个ReST风格的服务器作为Worker,eval相关的机制也可以方便地对已有代码进行求值。
3. Redis实现一个简单的任务分发系统很方便,比如可以直接使用订阅发布机制,分布的Worker获取Redis里待执行的任务,执行完后将结果统一放到另一个位置。
4. 调用者需要做的事就是分割计算任务,把相关的任务,包括使用的数据、参数等扔给Redis数据库,还有收集结果并拼成最终的计算结果。一个最简单的策略是直接分布实现一个map函数。

③ 关于Python(编程语言)的问题

dir() 函数是 Python 自省机制中最着名的部分,它返回传递给它的任何对象的属性名称经过排序的列表。如果不指定对象,则 dir() 返回当前作用域中的名称。

④ 请问学了python有什么用不

python适合快速开发,代码不仅优美,而且简洁。当然这是从美观上来说的。它本身是解释性语言,因此不需要编译即可运行。而且内置许多的高级数据结构,如常见的链表(python叫list),Hash表(python叫dict)等都是内置的。而且它没有静态类型声明,这样自然就是一种泛型编程。也不需要接口,但通过自省或约定可以轻松实现接口的功能。它的动态性还表现在可以在运行时改变一个实例,改变类(因为python中一切皆为对象,类也是一个对象)。还支持高级但更复杂的metaclass编程,即生成类的类。特别是它自带许多的标准库,功能都不错。python还提供一个交互环境可以进行测试。python有象java一样的包的概念,可以轻松管理你的模块。同时还有强大的自省功能,即在运行时检查对象的属性。支持自动垃圾回收。

因此python从使用,从学习上来说都是一种让人愉快的语言。举些简单的例子:

1. 打印一个文本文件的内容

print file('filename').read()

2. 动态给对象增加属性

class A:pass #空类
a = A() #a没有属性,其实有一些内置的属性,但现在不关心
a.b = 1 #动态增加一个属性
print a.b #可以看到为1

3. 约定的编程

def p(a):
print a.read()
这里只要a对象有read()方法即可成功,而不管它到底是什么,可以是一个文件对象,也可以是一个自定义的对象,但有read()方法。如果想进行一些检查,可以:
import types
def p(a):
if hasattr(a, 'read') and isinstance(a.read, types.FunctionType):
print a.read()
else:
raise Exception, 'Object should has a read function'

4.dir(a) #可以列出对象a的属性

等等。总之,它是一种动态类型解释性语言,与静态编译型语言差别非常大。这些东西只有深入下去才能有所体会。它的开发效率要高,执行效率目前的确是差一些,不过可以根据对效率的情况有选择的使用。而且还可以将C++或C写的程序封装为python的库在python中进行调用。因此还有人把python称之为“胶水语言”。

⑤ Python中的函数内省如何更好地理解

:、
第:帮助文档;
第二种:dir()括号内想要解象函数伟

⑥ python怎么查看object 里的成员变量

首先通过一个例子来看一下本文中可能用到的对象和相关概念。

  • #coding:utf-8import inspectprint inspect.ismole(inspect) #Trueprint inspect.isfunction(inspect.isfunction) #Trueprint inspect.isbuiltin(sorted) #Trueprint inspect.isroutine(sorted) #True

  • 对于实现了__call__的类实例,这个方法会返回False。如果目的是只要可以直接调用就需要是True的话,不妨使用isinstance(obj, collections.Callable)这种形式。我也不知道为什么Callable会在collections模块中,抱歉!我猜大概是因为collections模块中包含了很多其他的ABC(Abstract Base Class)的缘故吧:)

  • #coding:utf-8import collectionsclass Dog(object): def __call__(self, name):#实现__call__方法就可以直接调用对象了

  • print 'i am a dog named ' , name


  • dog = Dog()

  • dog('DaHuang')print isinstance(dog, collections.Callable) #Trueprint dog.__class__.__bases__

  • 3.2. 获取对象信息

  • getmembers(object[, predicate]):这个方法是dir()的扩展版,它会将dir()找到的名字对应的属性一并返回,形如[(name, value), ...]。另外,predicate是一个方法的引用,如果指定,则应当接受value作为参数并返回一个布尔值,如果为False,相应的属性将不会返回。使用is*作为第二个参数可以过滤出指定类型的属性。

  • getmole(object):还在为第2节中的__mole__属性只返回字符串而遗憾吗?这个方法一定可以满足你,它返回object的定义所在的模块对象。

  • get{file|sourcefile}(object):获取object的定义所在的模块的文件名|源代码文件名(如果没有则返回None)。用于内建的对象(内建模块、类、函数、方法)上时会抛出TypeError异常。

  • get{source|sourcelines}(object):获取object的定义的源代码,以字符串|字符串行表返回。代码无法访问时会抛出IOError异常。只能用于

  • ⑦ 请教python枚举进程所有模块名称,总是出错

    你没有问清楚。 python有比较强的“自省”功能。可以自己检查自己。 用globals可以检查出所有全局的变量,其中也包括模块名称。再用type, dir等方法来检查一下是否是模块就可以准确判断是否是模块。

    ⑧ 初学python,感受和C的不同

    从开始看Python到现在也有半个多月了,前后看了Python核心编程和Dive
    into
    Python两本书。话说半个月看两本,是个人都知道有多囫囵吞枣,这也是因为我暂时没有需求拿这个做大型开发,主要是平时的小程序test用一用。所以我的策略是,整体浏览,用到时候现查。话说这核心编程第一版太古老了,老在讲2.2之前的东西,我看的翻译电子版,翻译得也不好,很晦涩。看完这个后还有点云里雾里,看网上人家说DIP好,啄木鸟还有免费电子文档,就找来看这个。怎么说呢,讲的比核心编程好,但不适合第一次看的初学者。我之所以觉得讲得好,是因为看核心编程,有些概念还有些模糊,看了这本书就明白不少了。要是初学者上来就看这本,保证不好理解。

    下面就是在学习的过程中,在翻阅资料的过程中,总结的一些C和python比较明显的不同之处,有大方向的,也有细节的。肯定没有总结完,比如动态函数,lambda这些,我都懒得往上写了。实际上,作为两种完全不同的语言,下面这些差异只是冰山一角而已。权当抛砖引玉吧,至少应该对和我有相同研究兴趣,正在考虑是否学习另一门语言的朋友有点帮助。此文也算是DIP的学习笔记吧。顺带说一句,要是有朋友了解,可以帮忙推荐一下实战性强的Python教材,语言这东西,不多练手,光比划,是不可能学好的。

    学习目的

    我的以后的研究方向是嵌入式,显然,C语言是我的主要语言。我不是一个语言爱好者,我以前觉得,对于做研究而不是应用的人来说,了解多门语言,不如精通一门语言。之所以去看python,主要还是因为python更有利于快速开发一些程序,也是因为现在认识到,研究和应用是不能分离的。个人以为,要想在计算机工程的竞争中立足,必须懂C语言。因为真正要做高性能编程,
    不可能将机器的体系架构抛到脑后让Python虚拟机(或Java虚拟机等)帮你搞定所有底层。越来越多的CPU
    core,越来越恐怖的内存性能瓶颈,对于上层开发人员来说,无所谓,但是对高性能程序开发人员来说,这些是无法透明的。很多应用,还是自己掌控比较有效。这些场合中,汇编和C还是不可替代的。但是,光知道C是不够的,掌握一门面向对象语言,相对更高层的语言,不仅对以后的个人发展有利,也会对自己的技术认识产生帮助。

    如果要问对我来说谁更重要,我觉得还是C更重要。C的学习曲线更陡,貌似简单,实际上到处都是陷阱,看上去比较简单低效的程序,也不是学1,2个月就能搞定的。谈到优化的深层次和难度嘛,需要的功底是按年算的。但是一旦你C语言的基础打好了,对计算机的理解,对其他语言的理解都是大有裨益的。比如,如果你有C基础,可以说,学过1天python,就能写的出来一些不短的程序。后面的优化也不是什么大不了的算法,都是非常基本的语句换来换去。当然这里不是说
    Python不好,实际上,上层应用,Python比C方便的不是一个层次。

    很多人觉得,既然懂C了,那么进一步掌握C++应该是水到渠成,但C++不是C的超集,而我又不喜欢C++的繁琐和巨大,所以才决定看一看Python。我很喜欢Python的优雅与快捷。

    语言类型

    和C不一样,Python是一种动态类型语言,又是强类型语言。这个分类怎么理解呢?大概是可以按照下列说明来分类的:

    静态类型语言

    一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。Java和 C 是静态类型语言。

    动态类型语言

    一种在运行期间才去确定数据类型的语言,与静态类型相反。Python 是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。

    强类型语言

    一种总是强制类型定义的语言。Java 和 Python 是强制类型定义的。您有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串。

    弱类型语言

    一种类型可以被忽略的语言,与强类型相反。VBScript 是弱类型的。在 VBScript 中,您可以将字符串 ’12′ 和整数 3 进行连接得到字符串’123′,然后可以把它看成整数 123 ,所有这些都不需要任何的显示转换。

    对象机制

    具体怎么来理解这个“动态确定变量类型”,就要从Python的Object对象机制说起了。Objects(以下称对象)是Python对于数据的抽象,Python中所有的数据,都是由对象或者对象之间的关系表示的,函数是对象,字符串是对象,每个东西都是对象的概念。每一个对象都有三种属性:实体,类型和值。理解实体是理解对象中很重要的一步,实体一旦被创建,那么就一直不会改变,也不会被显式摧毁,同时通常意义来讲,决定对象所支持的操作方式的类型(type,包括number,string,tuple及其他)也不会改变,改变的只可能是它的值。如果要找一个具体点的说明,实体就相当于对象在内存中的地址,是本质存在。而类型和值都只是实体的外在呈现。然后Python提供一些接口让使用者和对象交互,比如id()函数用来获得对象实体的整形表示(实际在这里就是地址),type()函数获取其类型。

    这个object机制,就是c所不具备的,主要体现在下面几点:

    1 刚才说了,c是一个静态类型语言,我们可以定义int a, char
    b等等,但必须是在源代码里面事先规定。比如我们可以在Python里面任意一处直接规定a =
    “lk”,这样,a的类型就是string,这是在其赋值的时候才决定的,我们无须在代码中明确写出。而在C里面,我们必须显式规定char *a =
    “lk”,也就是人工事先规定好a的类型

    2 由于在C中,没有对象这个概念,只有“数据的表示”,比如说,如果有两个int变量a和b,我们想比较大小,可以用a ==
    b来判断,但是如果是两个字符串变量a和b,我们就不得不用strcmp来比较了,因为此时,a和b本质上是指向字符串的指针,如果直接还是用==比较,那比较的实际是指针中存储的值——地址。

    在Java中呢,我们通过使用 str1 == str2 可以确定两个字符串变量是否指向同一块物理内存位置,这叫做“对象同一性”。在 Java 中要比较两个字符串值,你要使用 str1.equals(str2)。

    然后在Python中,和前两者都不一样,由于对象的引入,我们可以用“is”这个运算符来比较两个对象的实体,和具体对象的type就没有关系了,比如你的对象是tuple也好,string也好,甚至class也好,都可以用”is”来比较,本质上就是“对象同一性”的比较,和Java中的==类似,和
    C中的pointer比较类似。Python中也有==比较,这个就是值比较了。

    3
    由于对象机制的引入,让Python的使用非常灵活,比如我们可以用自省方法来查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作。用这种方法,你可以定义没有名称的函数,不按函数声明的参数顺序调用函数,甚至引用事先并不知道名称的函数。
    这些操作在C中都是不可想象的。

    4 还有一个很有意思的细节,就是类型对对象行为的影响是各方面的,比如说,a = 1; b =
    1这个语句中,在Python里面引发的,可能是a,b同时指向一个值为1的对象,也可能是分别指向两个值为1的对象。而例如这个语句,c = []; d
    = [],那么c和d是肯定指向不同的,新创建的空list的。没完,如果是”c = d =
    []“这个语句呢?此时,c和d又指向了相同的list对象了。这些区别,都是在c中没有的。

    最后,我们来说说为什么python慢。主要原因就是function call overhead比较大。因为所有东西现在都是对象了,contruct 和destroy 花费也大。连1 + 1 都是 function call,像’12′+’45′ 这样的要 create a third string object, then calls the string obj’s __add。可想而知,速度如何能快起来?

    列表和数组

    分析Python中的list和C中的数组总是很有趣的。相信可能一些朋友和一样,初学列表的时候,都是把它当作是数组来学的。最初对于list和数组区别的定性,主要是集中在两点。首先,list可以包含很多不同的数据类型,比如

    ["this", 1, "is", "an", "array"]

    这个List,如果放在C中,其实是一个字符串数组,相当于二维的了。

    其次呢,list有很多方法,其本身就是一个对象,这个和C的单纯数组是不同的。对于List的操作很多样,因为有方法也有重载的运算符。也带来一些问题,比如下面这个例子:

    加入我们要产生一个多维列表,用下面这个语句

    A = [[None] * 2] * 3

    结果,A的值会是

    [[None, None], [None, None], [None, None]]

    初一看没问题,典型的二维数组形式的列表。好,现在我们想修改第一个None的值,用语句

    A[0][0] = 5

    现在我们再来看看A的值:

    [[5, None], [5, None], [5, None]]

    发现问题没有?这是因为用 * 来复制时,只是创建了对这个对象的引用,而不是真正的创建了它。 *3 创建了一个包含三个引用的列表,这三个引用都指向同一个长度为2的列表。其中一个行的改变会显示在所有行中,这当然不是你想要的。解决方法当然有,我们这样来创建

    A = [None]*3
    for i in range(3):
    A[i] = [None] * 2

    这样创建了一个包含三个不同的长度为2的列表。

    所以,还是一直强调的,越复杂的东西,越灵活,也越容易出错。

    代码优化

    C是一个很简单的语言,当我们考虑优化的时候,通常想得也很简单,比如系统级调用越少越好(缓冲区机制),消除循环的低效率和不必要的系统引用,等等,其实主要都是基于系统和硬件细节考虑的。而Python就完全不一样了,当然上面说的这些优化形式,对于Python仍然是实用的,但由于
    Python的语法形式千差万别,库和模块多种多样,所以对于语言本身而言,就有很多值得注意的优化要点,举几个例子吧。

    比如我们有一个list L1,想要构建一个新的list L2,L2包括L1的头4个元素。按照最直接的想法,代码应该是

    L2 = []
    for i in range[3]:
    L2.append(L1[i])

    而更加优化和优美的版本是

    L2 = L1[:3]

    再比如,如果s1..s7是大字符串(10K+),那么join([s1,s2,s3,s4,s5,s6,s7])就会比
    s1+s2+s3+s4+s5+s6+s7快得多,因为后者会计算很多次子表达式,而join()则在一次过程中完成所有的复制。还有,对于字符串操作,对字符串对象使用replace()方法。仅当在没有固定字符串模式时才使用正则表达式。

    所以说,以优化为评判标准,如果说C是短小精悍,Python就是博大精深。

    include和import

    在C语言中的include非常简单,因为形式单一,意义明确,当你需要用到外部函数等资源时,就用include。而Python中有一个相似的机制,就是import。乍一看,这两个家伙挺像的,不都是我们要用外部资源(最常见的就是函数或者模块(Python))时就用这个来指明么?其实不然,两者的处理机制本质区别在于,C中的include是用于告诉预处理器,这个include指定的文件的内容,你都给我当作在本地源文件中出现过。而

    import呢,不是简单的将后面的内容*直接*插入到本地里面去,这玩意更加灵活。事实上,几乎所有类似的机制,Python都比C灵活。这里不是说C不好,C很简练,我其实更喜欢C。

    简单说说这个灵活性。import在python中有三种形式,import X, from X import *( or a,b,c……), X =
    __import__(‘x’)。最常用的是第二种,因为比较方便,不像第一种那样老是用X.mole来调用模块。from X import
    *只是import那些public的mole(一般都是不以__命名的模块),也可以指定a,b,c来import。

    什么时候用哪一种形式呢?应该说,在大多数的模块文档里,都会明确告诉你应该用哪种形式。如果需要用到很多对象,那么from X import
    *可能更合适一些,但是,就目前来看,大多数第三方Python库都不推荐使用from molename import *
    这种格式。这样做会使引入者的namespace混乱。很多人甚至对于那些专门设计用于这种模式的模块(包括Tkinter,
    threading和matplot)都不采用这种方式。而如果你仅仅需要某个对象类a,那么用from X import a比用import
    X.a更好,因为以后你调用a的函数直接用a.function()既可以了,不用加X。

    如果你连自己希望import的模块都不知道怎么办?请注意,此时Python的优势就体现出来了,我们可以用
    __import__(mole)来调用mole,其中这个mole是字符串,这样,可以在运行时再决定,你到底要调用什么mole。举个例子:

    def classFromMole (mole, Name):
    mod = __import__ (mole)
    return getattr (mod, Name)

    这里,定义了一个函数classFromMole,你可以在代码的任何时候调用它,

    o = classFromMole (MoleOfTheClass, NameOfTheAttribute)()

    只需要传入字符串形式的你希望import的模块MoleOfTheClass和其中属性的名字NameOfTheAttribute(当然可以是数据也可以是方法),就能调用了,这个名字字符串不用事先指定,而是根据当时运行的情况来判断。

    顺带说一句,Python中import的顺序也有默认规定,这个和C中的include有点类似,因为我们一般都是先include系统文件,再
    include自己的头文件(而且还有<>和“”的区别)。Python中呢,一般应该按照以下顺序import模块:

    1. 标准库模块 — 如 sys, os, getopt 等

    2. 第三方模块

    3. 本地实现的模块。

    全局变量

    这里谈全局变量呢,倒不是说Python和c的全局变量概念不同,他们的概念是相同的。只是在使用机制上,是有一些差异的。举个例子:

    – mole.py –
    globalvar = 1

    def func():
    print globalvar
    # This makes someglobal readonly,
    # any attempt to write to someglobal
    # would create a new local variable.

    def func2():
    global globalvar
    globalvar = 2
    # this allows you to manipulate the global
    # variable

    在 func这个函数中,globalvar是只读的。如果你使用了globalvar =
    xxx这种赋值语句,Python会重新创造一个新的本地对象并将新值赋给它,原来的对象值不变。而在func2函数中,由于我们事先申明了
    globalvar是global的,那么此时的更改就直接在全局变量上生效。

    很明显这和c中的使用机制是不一样的,在c中,我们只要在函数外的全局区域申明了变量,就可以在函数中直接对其操作,不用还申明一个global。

    Published 2008-06-22

    Filed in c,code,python and
    tagged c, python

    ⑨ 什么是python中的自省

    自省就是程序运行时能够知道对象的类型,比如type()/isinstance()/hasattr()这种函数

    ⑩ 为什么选择Python编程

    随着新的编程语言的出现,目前很难选择一个适合您的编程语言。尽管python已经存在了许多年,但它近年来越来越流行,主要是因为其更简单和更灵活的性质。Python是一种通用的、面向对象、解释性和高级编程语言。
    那么,是什么让它不同于其他编程语言呢?像任何其他脚本语言一样,python也可以利用语法和动态类型,然而它有一个解释器与新功能以及数据类型可以在C或c++中实现。除此之外,Python编程还提供了广泛的可能性。
    Python编程提供了更多的可伸缩性:从桌面应用程序和web应用程序到网站系统管理,python可以用于不同的行业和不同的目的。2007年YouTube从PHP以及Python的灵活性来看,说明“Python提供了可伸缩性”。
    1、Python可以减少投入市场的时间:
    尽管python程序通常比Java程序运行速度慢一些,但是它需要较少的时间就可以开发和创造。Python程序通常比Java程序短4 - 5倍,这使得它非常适合于公司产品要迅速达到客户的满意度。
    Python是免费的:像PHP、python也是一个开源的编程语言,因此是免费使用的。开放源码许可允许不受阻碍的使用、改造和再分配代码的商业或个人。此外,它还有助于减少前期项目成本。
    2、容易集成:
    Python可以简单的创建web服务,并且可以调用CORBA或COM组件。它使用所有常见的互联网数据格式和协议,并提供可靠的过程控制能力。
    3、可重用性:
    可重用性的主要问题是任何有经验的开发人员。Python是一种鼓励的语言程序可以再次利用程序模块和包。Python提供了一个广泛范围的模块和包,作为标准Python库提供。还有一个广泛的第三方库提供python编程使它更方便和容易使用。
    Python在本质上是动态的:Python的动态特性是主要方面,使其成为一个友好和容易的语言代码。Python规划提供特性,比如反射、容易自省、和动态类型,减少编程时间和简化编码。
    4、生产力:
    相比其他编程语言可选的今天,一个可以得到很多功能在几行python编程代码下就可以完成。你可以完成一项任务在每次都比其他语言更少的代码,进而增加了生产力和降低了精力的花费。
    Python的未来以上所有点考虑,python似乎有明亮而清晰的未来。像YouTube这样的公司就是一个很好的例子,美国银行(Bank of America)、朋友饲料、Reddit python和Quora改变了他们的平台,因此造就了他们的强大性。
    它不但是一个容易和简单的语言用来学习,python也是各顶尖大学教学的首选,相当于在源源不断的发展为更新更熟练的语言。

    热点内容
    bin存储 发布:2025-02-07 20:00:50 浏览:202
    android加载界面 发布:2025-02-07 19:55:28 浏览:870
    好矿云服务器 发布:2025-02-07 19:54:31 浏览:948
    java电话簿 发布:2025-02-07 19:49:26 浏览:796
    超级脚本制作 发布:2025-02-07 19:31:30 浏览:486
    怎么查看支付宝的账号密码 发布:2025-02-07 19:26:48 浏览:16
    惠普服务器查看ip指令 发布:2025-02-07 19:26:47 浏览:434
    算法设计模式 发布:2025-02-07 19:15:52 浏览:746
    服务器1u能连接几台电脑 发布:2025-02-07 18:50:02 浏览:154
    立人编译 发布:2025-02-07 18:48:32 浏览:766