李成石

导航

 

字典实例化类

依对象的属性作为key值,value为属性值。以下使用user(**xiao)注入字典获取user对象,与使用 u = user('xiaoming', '123')一致

class user(object):

    def __init__(self,userName,password):
        self.userName = userName
        self.password = password

xiao = {'userName':'xiaoming','password':'123'}

u=user(**xiao)

print u.userName

日志打印format

formate打印注意string中变量和format中变量名对应

time = 10

name = 'caesar'

print "time:{time},name:{name}".format(time = time, name = name)

 元类

用于构造类的类,可以控制类的创建行为,需要在类上加上@six.add_metaclass('xxx'),如下:

type 有两个重载版本:
type(object),即我们最常用的版本。
type(name, bases, dict),一个更强大的版本。通过指定 类名称(name)、父类列表(bases)和 属性字典(dict)动态合成一个类

import six
#元类修改方法名
class Mymetaclass(type):
    def __new__(cls, clsname, bases,dct):
        my_attr={}
        for name,val in dct.items():
            if not name.startswith('__'):
                my_attr["my_"+name] = val # 类中的方法名加my_,val为方法对象
            else:
                my_attr[name] = val
        return type.__new__(cls, clsname, bases,my_attr)

# 创建类
@six.add_metaclass(Mymetaclass)
class ca_class(object):
    def print_name(self,name):
        print('%s come here' %name)

ca = ca_class()
ca.print_name('caesar') # 调用方法会报错

执行报错,没有print_name属性:

修改 print_name为my_print_name

 字典排序

dic = {"A":2,"Q":4,"B":7,"E":9,"C":1}
sorted(dic)

输出['A', 'B', 'C', 'E', 'Q']

dic = {"A":2,"Q":4,"B":7,"E":9,"C":1}
sorted(dic.items())

输出[('A', 2), ('B', 7), ('C', 1), ('E', 9), ('Q', 4)] 以key自然升序排列,元素为元组的list

li  = []
ciro = {'age':12,'name':'ciro'}
caesar = {'age':11,'name':'caesar'}
li.append(ciro)
li.append(caesar)
sorted(li, key=lambda x:x['age'])

 对序列按照其中元素或对象的某值进行排序,以上按照其中元素的age进行升序排序[{'age': 11, 'name': 'caesar'}, {'age': 12, 'name': 'ciro'}], 当指定reverse=True,按照逆序排列

三目表达 

逻辑 if 条件 else 逻辑 ,类似java中 (x==y)?'Y':'N' 如果X=Y 执行'Y',否则执行 ''N

self._sleep(wait_time if (started or wait_time is None) else 0)

多list合并一个list

两个list 合并为1个list 使用过 list = list1 + list2

将一个list中所有子列表合并成一个list

list_t = [["co","olor"],["bro","ther"]]
list(itertools.chain(*list_t))

列表推导式

①[x for x in data if condition]

此处if主要起条件判断作用,data数据中只有满足if条件的才会被留下,最后统一生成为一个数据列表

②[exp1 if condition else exp2 for x in data]

此处if...else主要起赋值作用,当data中的数据满足if条件时将其做exp1处理,否则按照exp2处理,最后统一生成为一个 数据列表

时间戳

time.time()获取当前时间数字

time.localtime() 获取当前时间数组

将当前时间转化为日期,将struct_time ,string-format-time

请日期转为时间戳 string-parse-time

datetime对象

datetime.datetime.now()获取当前时间datetime对象

datetime.timedelta(hours=1) 获取当前时间1小时前的datetime对象

datetime对象通过strftime("%Y-%m-%d %H:%M:%S")转为日期

在转化时间戳时,还是需要转为struct_time, datetime的timetuple方法

 类加载

在java中类加载,父类静态方法-->子类静态方法-->父类初始化方法--->子类初始化方法

但在python中,创建子类对象不加载父类静态方法和初始化方法(此处加载即执行),而是将父类的方法属性作为子类的方法属性

super(B, self).__init__() ,super用于调用父类方法。

 类中__call__

__call__ 在那些类的实例经常改变状态的时候会非常有效。调用这个实例是一种改变这个对象状态的直接和优雅的做法

正则表达式

 给每个匹配起一个漂亮的名字(类似pyparsing的setResultsName 

在正则中使用(?P<name>正则匹配)

import re

netinfo="enp0s3:   13857     151    0    0    0     0          0       0   " \
                "  15432     185    0    0    0     0       0          0"
pa="(?P<name>[a-z\d]+:)\s+" \
   "(?P<rx_bytes>\d+)\s+" \
   "(?P<rx_packets>\d+)\s+" \
   "(?P<rx_errs>\d+)\s+" \
   "(?P<rx_drop>\d+)\s+" \
   "(?P<rx_fifo>\d+)\s+" \
   "(?P<rx_frame>\d+)\s+" \
   "(?P<rx_compressed>\d+)\s+" \
   "(?P<rx_multicast>\d+)\s+" \
   "(?P<tx_bytes>\d+)\s+" \
   "(?P<tx_packets>\d+)\s+" \
   "(?P<tx_errs>\d+)\s+" \
   "(?P<tx_drop>\d+)\s+" \
   "(?P<tx_fifo>\d+)\s+" \
   "(?P<tx_colls>\d+)\s+" \
   "(?P<tx_carrier>\d+)\s+" \
   "(?P<tx_compressed>\d+)"
p=re.compile(pa)
match = p.search(netinfo)
m=match.groupdict()
print m

执行后返回:

// 前瞻:
exp1(?=exp2) 查找exp2前面的exp1
// 后顾:
(?<=exp2)exp1 查找exp2后面的exp1
// 负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
// 负后顾:
(?<!exp2)exp1 查找前面不是exp2的exp1

>>> re.sub(r'(?<=\[\')foo',"caesar", "['foo1', 'foo2'")
"['caesar1', 'foo2'"

与linux命令交互

读取linux命令控制台输出,sys.stdin.readlines()

 

posted on 2018-09-01 13:34  李成石  阅读(188)  评论(0编辑  收藏  举报