设为首页 收藏本站
查看: 1046|回复: 0

[经验分享] python is obvious !

[复制链接]

尚未签到

发表于 2017-4-24 12:15:25 | 显示全部楼层 |阅读模式
初识 python 的时候常常会被一些陌生的概念绊倒,而当熟悉了这些概念之后你会发现它们原来是如此的简单明了!由于它们是如此的简单,所以我试图在*一*篇文章中就想把它们全部都介绍一遍。

  • 万物皆对象,甚至一个小小的整数也不例外;而变量只是一个名字,它可以绑定到任何一个对象;使用内置函数 id 可以查看绑定的对象的 id ,语言的实现会保证两个不同对象的 id 是绝对不一样的。
    >>> a = 1
    >>> id(a)
    11541872
    >>> a = 2
    >>> id(a)
    11541860
    >>> b=1
    >>> id(b)
    11541872
  • callable 对象
    函数、方法、类、实现了 __call__ 方法的实例对象 都是 callable 对象。callable 的意思就是在后面写个括号直接就可以进行调用了。调用内置函数 callable 可以检验一个对象是否 callable 对象。
    >>> def check(obj):
    ...   if callable(obj):
    ...     obj(1,2)
    ...   else:
    ...     print 'not a callable'
    ...
    >>> def func(a,b):print a,b
    ...
    >>> class Temp(object):
    ...   def __init__(self,a,b):print a,b
    ...   def __call__(self,a,b):print a,b
    ...   def method(self,a,b):print a,b
    ...
    >>> check(func)
    1 2
    >>> check(Temp)
    1 2
    >>> t = Temp(1,2)
    1 2
    >>> check(t)
    1 2
    >>> check(t.method)
    1 2
    >>>
  • 参数传递机制
    >>> def a_func(a,b,c=1,d=2):print a,b,c,d
    ...
    >>> a_func(1,2,d=4,c=3)
    1 2 3 4
    >>> a_func(1,2,3,d=4)
    1 2 3 4
    >>> a_func(1,2)
    1 2 1 2
    >>> args = (1,2)
    >>> kw = dict(c=3,d=4)
    >>> a_func(*args, **kw)
    1 2 3 4
    >>> def a_func(*args, **kw):
    ...   print args
    ...   print kw
    ...
    >>> a_func(1,2,d=4,c=3)
    (1, 2)
    {'c': 3, 'd': 4}
  • docorate
    一个装饰就是一个接受一个函数作为参数的函数,它返回的还是一个函数。
    好像有点绕口,还是让代码说话吧:
    >>> def simple_log(func):
    ...   def new_func(*arg, **kw):
    ...     print 'enter',func.func_name
    ...     func(*arg, **kw)
    ...     print 'exit',func.func_name
    ...   return new_func
    ...
    >>> def log(some_args):
    ...   def simple_log(func):
    ...     def new_func(*arg, **kw):
    ...       print some_args,'enter',func.func_name
    ...       func(*arg, **kw)
    ...       print some_args,'exit',func.func_name
    ...     return new_func
    ...   return simple_log
    ...
    >>> def a_func(a,b):print a,b
    ...
    >>> simple_log(a_func)(1,2)
    enter a_func
    1 2
    exit a_func
    >>> @simple_log
    ... def a_func(a,b):print a,b
    ...
    >>> a_func(1,2)
    enter a_func
    1 2
    exit a_func
    >>> log('haha')(a_func)(1,2)
    haha enter a_func
    1 2
    haha exit a_func
    >>> @log('haha')
    ... def a_func(a,b):print a,b
    ...
    >>> a_func(1,2)
    haha enter a_func
    1 2
    haha exit a_func
  • new style class
    继承自 object 的都是 new style class,详细内容参考这里
  • __new__
    参考
  • staticmethod, classmethod
    参考
  • metaclass
    参考
    实例对象由 class 构造而成,而 class 便是由 metaclass 构造而成。
    简单地说一个 metaclass 就是一个接受三个参数(class的名字,基类tuple,class 的属性字典)的 callable 对象,它返回一个 class 。在构建 class 的时候便会调用这个 callable 对象,并使用它返回的 class 。
    所有内建类型的 metaclass 和 new style class 默认的 metaclass 都是 type
    >>> def meta(name, bases, classdict):
    ...   print name
    ...   print bases
    ...   print classdict
    ...   return type(name, bases, classdict)
    ...
    >>> class Temp(object):
    ...   __metaclass__ = meta
    ...   a = 1
    ...   def b():pass
    ...
    Temp
    (<type object="">,)
    {'a': 1, '__module__': '__main__', 'b': <function at="" b="">, '__metaclass
    __': <function at="" meta="">}
    >>> class ATemp(Temp):
    ...   __metaclass__ = meta
    ...
    ATemp
    (<class __main__.temp="">,)
    {'__module__': '__main__', '__metaclass__': <function at="" meta="">}</function></class></function></function></type>

暂时只想到这些,当然遗漏在所难免了,如有任何意见,欢迎评论 :)
update [2006-9-21]:
结合 callable 和 docorate ,其实 docorate 那个 log 的例子还可以这么写,似乎更好读一些:
>>> class log(object):
...   def __init__(self, someargs):
...     self.args = someargs
...   def __call__(self,func):
...     def new_func(*args,**kw):
...       print self.args,'enter',func.func_name
...       func(*args,**kw)
...       print self.args,'exit',func.func_name
...     return new_func
...
>>> @log('haha')
... def a_func(a,b):print a,b
...
>>> a_func(1,2)
haha enter a_func
1 2
haha exit a_func

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-368652-1-1.html 上篇帖子: 如何编译Python程序 下篇帖子: python Decimal 使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表