zoukankan      html  css  js  c++  java
  • Python tips

    <1>完全吊炸天构造器的写法。。。

    import os
    import threading,time
    class GenericInputData(object):
        def read(self):
            raise NotImplementedError
        @classmethod
        def generate_inputs(cls,config):
            raise NotImplementedError
        
    class PathInputData(GenericInputData):
        def __init__(self,path):
            super(PathInputData, self).__init__()
            self.path=path
        def read(self):
            return open(self.path).read()
        def get_path_name(self):
            return self.path
    
    
        """this class method init the Constructor function->__init__() ... """
        @classmethod
        def generate_inputs(cls,config):
            data_dir = config['data_dir'] #dict elements
            for name in os.listdir(data_dir):
                yield cls(os.path.join(data_dir,name))
    
    class GenerateWorker(object):
        def __init__(self,input_data):
            self.input_data = input_data
            self.result = None
        def map(self):
            raise NotImplementedError
        def reduce(self, other):
            raise NotImplementedError
        @classmethod
        def create_workers(cls,input_class,config):
            workers = []
            for input_path_data in input_class.generate_inputs(config):
                workers.append(cls(input_path_data))  # direct __init__ Constructor function
            return workers
    
    
    class LineCountWorker(GenerateWorker):
        """default no __init__ function, then will use the default parent class __init__"""
        def __init__(self,input_data):
            super(LineCountWorker, self).__init__(input_data)
        def map(self):
            data = self.input_data.read()
            self.result = data.count("
    ")
        def reduce(self, other):
            self.result+= other.result
        def get_worker_name(self):
            return self.input_data.get_path_name()
    
    
    class Thread_Excute_workers(threading.Thread):
        def __init__(self,threadId,worker):
            super(Thread_Excute_workers, self).__init__()
            self.worker = worker
            self.th_id = threadId
        def run(self):
            self.worker.map()
            print "Thread ID " + str(self.th_id) + " run " + self.worker.get_worker_name() + '
    '
    
    def excute(workers):
        threads = [] # create thread elements
        thread_id = 0
        for w in workers:
            th = Thread_Excute_workers(thread_id,w)
            th.start()
            threads.append(th)
            thread_id = thread_id + 1
        for rh_thread in threads:
            rh_thread.join()
    
        # caculate worker of reduce
        first,rest = workers[0],workers[1:]
        for rh_work in rest:
            first.reduce(rh_work)
        return first.result
    
    def mapreduce(worker_class,input_class,config):
        workers = worker_class.create_workers(input_class,config)
        return excute(workers)
    
    
    config = {'data_dir': "C:\data_dir"}
    result = mapreduce(LineCountWorker,PathInputData,config)
    print result
    View Code

    <2> Create md5

    import hashlib
    
    def getMd5(data):
        md5_obj = hashlib.md5()
        md5_obj.update(str(data))
        md5_var = md5_obj.hexdigest()
        return md5_var
    if __name__ == "__main__":
        a = getMd5(1)
        b = getMd5(1)
        print a==b
        print a
    View Code

    <3> 单元测试

    def just_do_it(text):
        return text.capitalize()
    cap.py
    import cap
    import unittest
    class TestCap(unittest.TestCase):
        def test_one_word(self):
            text = 'duck'
            result = cap.just_do_it(text)
            self.assertEqual(result,'Duck')
    
        def test_length(self):
            test = 'duck'
            result = len(cap.just_do_it(test))
            self.assertEqual(result,4)
    if __name__ == '__main__':
        log_file = "log_file.txt"
        f = open(log_file, "w")
        runner = unittest.TextTestRunner(stream=f,verbosity=2)
        unittest.main(exit = False,testRunner=runner)
        f.close()
    unittest_cap

    如果不想放在文件里,直接unittest.main()

    <4>Bytes 子节

    (1)转换字节:

    (2) 读取png 文件的width ,height

    import struct
    import pprint
    import binascii
    pngHeader = b'x89PNG
    x1a
    '
    f = file('test.png',mode='r')
    pngByte = f.read(30)
    
    
    if pngByte[:8] == pngHeader:
        print 'this is a png file'
        # '> big-endian'
        # 'L is 4 bytes unsigned long int'
        # 'width is at 16-20 stream pos, height is 21-24 stream pos'
        # 'L L is 8 bytes'
        width,height = struct.unpack('>LL',pngByte[16:24])
        print 'width height:',width,height
    
    
        print 'width bytes is ' , struct.unpack('>L',pngByte[16:20])
        print 'height bytes is ' , pngByte[20:24]
    View Code

    (3)一些类的概念:

    """
    # <1>PROPERTY do not hidden_name member , but can use name=PROPERTY(get,set)
    class duck():
        def __init__(self,input_name):
            self.hidden_name = input_name
        def get_name(self):
            print 'inside getter'
            return self.hidden_name
        def set_name(self,input_name):
            self.hidden_name = input_name
        name = property(get_name,set_name)
    
    if __name__ == "__main__":
        d = duck('tttttt')
        d.hidden_name = 'ttt'         # Very stupid , not hidden
        #d.set_name()                 # this can be called ok
        print d.name
    """
    
    
    """
    # <2>use @property and setter method
    class duck():
        def __init__(self,input_name):
            self.hidden_name = input_name
    
        #GETTER METHOD
        @property
        def name(self):
            print 'inside the getter'
            return self.hidden_name
    
        #SETTER METHOD
        @name.setter
        def name(self,input_name):
            print 'inside the getter'
            self.hidden_name = input_name
    
    d = duck('houdini')
    d.name = "test"
    print d.name
    """
    
    
    
    """
    #<3> @property connect the self.member
    class Circle():
        def __init__(self,radius):
            self.radius = radius
    
        @property
        def diameter(self):
            return self.radius*2
    
    c = Circle(2)
    print c.radius      # 2
    print c.diameter    # 4
    c.radius = 7
    print c.diameter    # 14
    
    c.diameter = 1000   # It's can not set value,because it have not diameter.setter(),but in py2.7 ,it set ok......
    print c.diameter    # 1000
    """
    
    
    """
    #<4> hidden ?
    class Duck():
        def __init__(self,input_name):
            self.__name = input_name
    
        @property
        def name(self):
            print 'getter method'
            return self.__name
        @name.setter
        def name(self,input_name):
            print 'setter method'
            self.__name = input_name
    
    
    d = Duck('Maya')
    print d.name
    d.name = 'Houdini'
    print d.name
    #print d.__name         #ERROR
    #print d._Duck__name    #Get hidden member,But Result is Maya....
    """
    
    """
    #<5> @classmethod,class member
    class A():
        count = 0  #Same as C++ static member
        def __init__(self):
            A.count += 1 #Same as C++ static member
    
        @classmethod
        def kids(cls):
            print " A has childs num is " ,cls.count
    a1=A()
    a2=A()
    a3=A()
    A.kids()
    """
    
    
    #<6> Magic method
    class Word():
        def __init__(self,text):
            self.text = text
    
        def __eq__(self, other):
            return self.text == other.text
    
        def __add__(self, other):
            return Word(self.text+other.text)
    
        def __sub__(self, other):
            return Word(self.text-other.text)
    a = Word(1)
    b = Word(2)
    print a==b                    # False
    c = a+b
    print c.text                  # 3
    print isinstance(c,int)       # False
    print isinstance(c,float)     # False
    print isinstance(c,Word)      # True
    View Code

    (4) 深入函数参数:*arg,**kwargs,指向函数的参数

    # coding=utf-8
    '''
        Created  by yangping liu on 2017-05-19.
        Copyright (c) 2018 YiAnimation.All rights reserved.
    '''
    
    #<1>
    #参数*arg,其实进去就作为元组
    def test_turple(*arg): #arg as tuple
        print arg
        for x in arg:
            print '*arg index value is ' ,x
    #参数**kwargs,进去就作为字典
    def test_dictArguments(farg, **kwargs): #kwargs as dict
        print "farg:", farg
        for key in kwargs:
            print "another keyword arg: %s: %s" % (key, kwargs[key])
    
    test_turple(1,2,3,4,5)
    test_dictArguments(farg=1, myarg2="two", myarg3=3)
    
    #<2>
    #定义一个add函数,接受*args,其实*args是有顺序的元组
    def add(*args):
        return sum(args)
    
    #定义一个callback,用来指向函数,而args是callback函数的参数
    def testAddpointer(callback,*args):
        if(len(args)) == 0 : #non arg function
            return callback()
        return callback(*args)
    
    print testAddpointer(add)
    print testAddpointer(add,1,2,3)
    print testAddpointer(add,1,2,4,5,6,7,8,9)
    
    
    #定义一个只有2个参数,其实对于+法功能其实很垃圾,毕竟不能1+2+3+4...
    def addBad(x=0,y=1):
        return x+y
    print testAddpointer(addBad)       # 1 我们的函数参数 函数指针依然适合
    print testAddpointer(addBad,1,2)   # 3 函数参数 函数指针依然适合
    
    
    #<3>
    print "
    dict to function arguments samples"
    #定义一个加法,不过这次有3个参数
    def add2(arg1,arg2,arg3):
        return arg1 + arg2 + arg3
    kwargs = {"arg2" :2,"arg3" :3}
    #把1可以传入arg1,**kwargs就会会作为arg2 = 2 ,arg3=3
    print add2(1,**kwargs) #结果6
    
    
    
    #<4>
    print '
    function pointer to a function,args is **kwargs'
    def add3(master,senior):
        return master+senior
    #我们函数参数这次带的是**kwargs
    def testAddPointerDict(callback,**kwargs): 
        return add3(**kwargs)  #注意传入方法
    dictFunctionArg = {'master':1,'senior':2}
    print testAddPointerDict(add3,**dictFunctionArg)  # ok
    print testAddPointerDict(add3,master=1,senior=2)  # ok
    print testAddPointerDict(add3,senior=2,master=1)  # ok
    View Code

    (5)修饰器:

    def document_it(func):
        def new_function(*args,**kwargs):
            print "running function : " ,func.__name__
            print 'position arguments : ',args
            print 'keyword arguments : ' ,kwargs
            result = func(*args,**kwargs)
            print('Result :',result)
            return result
        return new_function
    
    def add_ints(a,b):
        return a+b
    
    cooler_add_ints = document_it(add_ints) #implicat the de
    print cooler_add_ints(a=1,b=2)
    print cooler_add_ints(b=3,a=2)
    print cooler_add_ints(1,2)
    
    # direct document this function
    @document_it
    def add_ints2(a,b):
        return a+b
    View Code

    (6)如何制作更加成熟的callBack

    class callback(object):
        def __init__(self, func, *args, **kwargs):
            self.func = func
            self.args = args
            self.kwargs = kwargs
    
        def __call__(self, *args):
            try:
                return self.func(*self.args, **self.kwargs)
            except:
                return None
    
    #define add_simple
    def add_simple(x,y):
        return x+y
    add_simpleCallBack = callback(add_simple,10,15)
    
    #define print simple
    def print_simple(var= 'Error Code'):
        print var
    print_simpleCallBack = callback(print_simple)
    
    if add_simpleCallBack:
        print 'callback add object object:' ,add_simpleCallBack()
    if print_simpleCallBack:
        print 'callback print simple:',print_simpleCallBack()
    View Code

    (7)一些特殊方法测试:

    class Description:
        def __init__(self):
            self.data = []
        def __add__(self, other):
            self.data.append(other)
            return self
        def __str__(self):
            return str(self.data)
        def __sub__(self, other):
            self.data.remove(other)
            return self
        def __len__(self):
            return len(self.data)
        def __getitem__(self, item):
            return self.data[item]
    
    if __name__ == "__main__":
        e = Description()
        e+=1
        e+=2
        e+=3
        e-=3
        e+='houdini'
        e+='maya'
        print 'length is ',len(e), ' Data is :',e
        print e[0]
    View Code

    (8)打包

    C:Python27Scriptspyinstaller.exe -F -w --name MusterRendering --icon=icon.ico sqlite_muster.py

     

     <>元类:

    "Type" create a class:

    class ObjectCreator(object):
        pass
    
    
    def echo(cls):
        print cls
    
    
    def unit_test_part1():
        my_object = ObjectCreator()
        echo(my_object)
        echo(ObjectCreator)
        echo(hasattr(ObjectCreator, "new_attribute"))
    
        # add new_attribute='foo' for class
        ObjectCreator.new_attribute = 'foo'           #attribute for class
        echo(hasattr(ObjectCreator, "new_attribute")) #true
        echo(ObjectCreator.new_attribute)             #foo
    
        #Class to a variable
        nclass = ObjectCreator
        echo(hasattr(nclass,"new_attribute"))         #true
        echo(nclass.new_attribute)                    #foo
    
        # type create class
        foo = type('foo',(),{'bar':True})             #create a class 'foo'
        echo(foo.__class__)                           #type 'type'
        echo(type(foo))                               #type 'type'
        echo(foo)                                     #<class '__main__.foo'>
        echo(foo.bar)                                 #true
        fooChild = type('fooChild',(foo,),{'ok':False})
        echo(fooChild)
        echo(fooChild.bar)                            #true
        echo(fooChild.ok)  
    View Code

    type.__class__ ,type.__class__.__class__

    # unit_test part2
    def unit_test_part2():
        def foo():
            pass
        echo(foo.__class__)                           #type 'function'
        echo('houdini'.__class__)                     #type 'str'
        echo((2).__class__)                           #type 'int'
        echo((2).__class__.__class__)                 #type 'type'
    View Code

    Change class member name to a Upper.

    def upper_attr(future_class_name, future_class_parents, future_class_attr):
        print future_class_name,"|",future_class_parents,"|",future_class_attr
        att = {}
        for name,value in future_class_attr.items():
            if name.startswith('__'):
                continue
            att[name.upper()] = value
        att['json'] = "json"                   # add a lower attribute for class
    
        return type(future_class_name, future_class_parents, att)
    
    #__metaclass__ = upper_attr
    
    class Foo(object):
        bar = 'pip'
        hou = 'houdini'
        __metaclass__ = upper_attr
    
    
    if __name__ == "__main__":
        print Foo.BAR
        print Foo.HOU
        print Foo.json
    View Code

     OOP metaClass

    generate some attribute for class

    class MetaClass(type):
        def __new__(cls,name,baseClass,dict):
            print '==================='
            print cls
            print name
            print baseClass
            print dict
            print '==================='
    
            attrib = {}
            attrib['houdini'] = '1'
            attrib['maya']    = '2'
            attrib['nuke']     = '3'
            return super(MetaClass, cls).__new__(cls,name,baseClass,attrib)
    
    class Foo2(object):
        __metaclass__ = MetaClass
    
    if __name__ == "__main__":
        print Foo2.houdini
        print Foo2.maya
        print Foo2.nuke
    View Code

    结果:

    ===================
    <class '__main__.MetaClass'>
    Foo2
    (<type 'object'>,)
    {'__module__': '__main__', '__metaclass__': <class '__main__.MetaClass'>}
    ===================
    1
    2
    3

     PyQt5 对应python2.7 

    pip install python-qt5

    ..

  • 相关阅读:
    Nodejs接收图片base64格式保存为文件
    tracking.js实现前端人脸识别
    node.js执行shell命令进行服务器重启
    Cordova 实现沉浸式(透明)状态栏效果
    SpringBoot启动原理详解
    连续子数组的最大乘积及连续子数组的最大和(Java)
    记录面试遇到的几个自己不太熟悉的问题(3)
    记录面试遇到的几个自己不太熟悉的问题(2)
    记录面试遇到的几个自己不太熟悉的问题(1)
    Java设计模式
  • 原文地址:https://www.cnblogs.com/gearslogy/p/5327153.html
Copyright © 2011-2022 走看看