Python动态特性

原创 2015年11月22日 02:18:19

Python在设计之初,就确立了充分相信用户的原则。轻封装和类型安全机制,用户自己保证其使用正确性。代表性的设计就是class不提供private关键字;无法定义常量;函数参数无类型,只有运行时类型检查;几乎所有定义都可以动态修改。这些设定与传统静态语言相比,牺牲安全性换取了异常强大而便捷的动态特性,使得Python非常适合进行小规模程序的快速开发、策略的高频迭代。
长期习惯了C/C++系的静态语言后,切换到Python中往往仍习惯使用静态办法解决问题,而不能充分利用Python的动态特性。这往往使得代码变得不必要地长且难以理解。
希望在进阶Python的过程中,逐步掌握更加高级、简捷的语言特性,将更多的精力放到解决问题当中去。


继承和多态

对于Python而言,由于只有运行时类型检查,不需要用abstract class 或interface实现多态,直接将不同对象扔到一个list里依次调用即可,不存在的方法在运行时报错。
该编程风格称为duck-typing

用于符号表、数据库、场景管理十分方便


函数对象

在Python中,以函数作为对象进行传递是很普遍的做法,典型应用例如:

  • 数值优化中作为目标函数
  • 回调函数

Python对可变参数列表提供了完善的支持


import inspect

inspect.getargspec(foo)
#返回ArgSpec(args, varargs, keywords, defaults) 其中default是最后n个默认值

#此外还有
inspect.getfullargspec(func)
inspect.currentframe()  #当前执行上下文
inspect.stack()     #栈

用字符串创建对应名字的类对象


class ButtonFactory():
    def create_button(self, typ):
        targetclass = typ.capitalize()
        return globals()[targetclass]()

使用方法

button_obj = ButtonFactory()
button_obj.create_button('button').

类方法的动态指定

class  Fruit(object):
    pass

def add(self):
    print("add")

def update(self):
    print("update")

if __name__ == "__main__"
    Fruit.grow = add
    fruit = Fruit()
    fruit.grow()
    Fruit.grow = update    #注意此处没有新建对象,只更改了类
    fruit.grow()

输出

add
update

变量的动态类型转换

list中可以混合存放各种类型对象
numpy.array中的


动态化属性和方法的调用

  • __getattr__ 当调用不存在的属性时,如果存在__getattr__方法,就会调用来尝试获得属性
  • __call__ 使实例本身变成可调用的。
class Chain(object):

    def __init__(self, path=''):
        self._path = path

    def __getattr__(self, path):
        return Chain('%s/%s' % (self._path, path))

    def __str__(self):
        return self._path

    def __call__(self, attr):
        return Chain('%s/%s' % (self._path, attr))

直接使用 Chain().schools.status.users 就可以得到格式化字符串 schools/status/users
若需要 /schools/users/ID/report,其中ID是一个参数,则可以利用__call__将对象变成可调用的 Chain().schools.users(ID).report


相关文章推荐

Python 模块动态加载技术

使用 exec 实现 Python 模块动态加载 该技术可以使用 python 语法的配置文件,并在系统运行过程中实现配置文件的更新 该技术也可以将 python 脚本作为业务逻辑动态加载到运行的系统...

Python动态加载

动态加载模块、类和方法
  • dutsoft
  • dutsoft
  • 2016年07月28日 13:12
  • 440

Python学习-使用matplotlib画动态多图

matplotlib画动态多图

python的动态性以及 使用__slots__

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class: class Student(object): ...

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

Radon变换理论介绍与matlab实现--经验交流

本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...

CT图像重建技术

由于csdn贴图不方便,并且不能上传附件,我把原文上传到了资源空间CT图像重建技术 1.引言 计算机层析成像(Computed Tomography,CT)是通过对物体进行不同角度的射线投影测量而...

Matlab绘图-很详细,很全面

Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Ma...

linux查找目录下的所有文件中是否含有某个字符串

查找目录下的所有文件中是否含有某个字符串  find .|xargs grep -ri "IBM"  查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名  find .|xargs g...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python动态特性
举报原因:
原因补充:

(最多只允许输入30个字)