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动态加载

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

Python——动态数据类型

本文介绍了Python中的动态数据类型,即能够在原处修改的类型,比如列表list
  • ggGavin
  • ggGavin
  • 2015年11月10日 14:04
  • 1764

python-动态特性学习

python语言的动态特性学习
  • zhangchilei
  • zhangchilei
  • 2015年08月24日 16:21
  • 600

Python 动态类型

动态类型(dynamic typing)是Python另一个重要的核心概念。我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值。这些都与动态类型的概念...
  • xiaoyezi_1834
  • xiaoyezi_1834
  • 2016年06月15日 09:38
  • 311

Python 动态类型 变量基本上是动态变量

动态类型(dynamic typing)是Python另一个重要的核心概念。我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值。这些都与动态类型的概...
  • lujiandong1
  • lujiandong1
  • 2015年05月21日 19:45
  • 1049

python动态类型

最近关注着python,越来越喜欢它了。下面是我看python的学习手册学习到的理论,给大家分享一下: 如果你有静态编译类型语言c,c++,java的背景,你也许有些困惑。我们在使用变量时,都没...
  • chenjinyu_tang
  • chenjinyu_tang
  • 2011年09月01日 10:15
  • 3009

python的特性

python使用c语言开发 1.面向对象的特性 面向对象的程序设计抽象出对象的行为和属性,把行为和属性分离开,但是又合理的组织在一起。它消除了保护类型、抽象类、接口等面向对象的元素,使得面向对象的...
  • huaweitman
  • huaweitman
  • 2013年07月27日 17:20
  • 4322

流畅python学习笔记:第十九章:动态属性和特性

首先来看一个json文件的读取。书中给出了一个json样例。该json文件有700多K,数据量充足,适合本章的例子。文件的具体内容可以在http://www.oreilly.com/pub/sc/os...
  • ogog123
  • ogog123
  • 2017年09月04日 16:33
  • 106

python动态语言特性小结

动态函数,动态模块,动态参数 python 动态语言特性 A.动态模块调用 如果模块是动态的,如从某个配置文件中读取. 那么关于模块的字符串如何转换为代码的import呢,下面代码很好解释了这...
  • linkyou
  • linkyou
  • 2010年06月17日 16:45
  • 1084

Python“不为人知的”特性

来源:http://foofish.net/blog/25/python-tricks-tips 本文整理自Stack Overflow上的热门问答hidden features...
  • heybob
  • heybob
  • 2016年08月31日 17:26
  • 1123
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python动态特性
举报原因:
原因补充:

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