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

[经验分享] python技巧31[python Tip2]

[复制链接]

尚未签到

发表于 2015-4-20 10:16:32 | 显示全部楼层 |阅读模式
  
  1 函数的默认值为mutable类型时的问题和解决办法


def f2(a, L=[]):
    L.append(a)
    return L
print(f2(1))
print(f2(2))
print(f2(3))
def f3(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L
print(f3(1))
print(f3(2))
print(f3(3))
# the result will be
#[1]
#[1, 2]
#[1, 2, 3]
#[1]
#[2]
#[3]

from copy import deepcopy
def resetDefaults(f):
    defaults = f.__defaults__
    def resetter(*args, **kwds):
        f.__defaults__ = deepcopy(defaults)
        return f(*args, **kwds)
                    
    resetter.__name__ = f.__name__
    return resetter
                           
@resetDefaults # This is how you apply a decorator
def TestDefaultCorrect(item, stuff = []):
     stuff.append(item)
     print (stuff)
TestDefaultCorrect(1)
# prints '[1]'
TestDefaultCorrect(2)
# prints '[2]', as expected  
  
  2 函数装饰模式


def decorator1(func):
    return lambda: func() + 1
def decorator2(func):
    def print_func():
        print (func())
    return print_func
@decorator2
@decorator1
def function():
    return 41
# to cal functions(), it is equal to call decorator2(decorator1(function))

function()
# prints '42'  
  
  3 检查类型的属性和方法是否存在


class Class:
    answer = 42
getattr(Class, 'answer')
# returns 42
getattr(Class, 'question', 'What is six times nine?')
# returns 'What is six times nine?'
getattr(Class, 'question')
# raises AttributeError  
  
  4 动态修改类中的函数


class Class:
   def method(self):
       print ('Hey a method' )
      
instance = Class()
instance.method()
# prints 'Hey a method'

def new_method(self):
    print ('New method wins!')
   
Class.method = new_method
instance.method()
# prints 'New method wins!'  
  
  5 类的静态方法的使用


class Class:
    @classmethod
    def a_class_method(cls):
       print ('I was called from class %s' % cls)
    @staticmethod
    def a_static_method():
        print ('I have no idea where I was called from')
        
    def another_static_method():
         print ('I have no idea where I was called from2')
    def an_instance_method(self):
        print ('I was called from the instance %s' % self)
instance = Class()
Class.a_class_method()
instance.a_class_method()
# both print 'I was called from class __main__.Class'

Class.a_static_method()
instance.a_static_method()
# both print 'I have no idea where I was called from'

Class.another_static_method()
# both print 'I have no idea where I was called from2'
#instance.another_static_method()
#TypeError: another_static_method() takes no arguments (1 given)

#Class.an_instance_method()
# TypeError: an_instance_method() takes exactly 1 positional argument (0 given)
instance.an_instance_method()
# prints something like 'I was called from the instance '  
  6 使用main来作为python文件的入口
  if __name__ == "__main__":
  
  7 将函数的输出重定向到文件 (以下代码有个bug)


import sys
def stdoutToFile(filename, function, args ):
    oldStdout = sys.stdout
    f = open(filename, "w" )
    sys.stdout = f
    function(args)
    #sys.stdout.flush()
    #f.close()
    sys.stdout = oldStdout

if __name__=='__main__':
  print("modules")
  stdoutToFile("modules.txt", help, "modules")
  print("builtins")
  stdoutToFile("builtins.txt", help, "builtins")
  print("keywords")
  stdoutToFile("keyword.txt", help, "keywords")
  
  
  
  参考:http://www.siafoo.net/article/52#id26
  
  完!

运维网声明 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-58696-1-1.html 上篇帖子: 每周一荐:Python Web开发框架Django 下篇帖子: 检查Python对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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