38、继承
子类继承父类时,如果不写init方法,表示继承父类的init方法。如果写了init方法,表示重写父类的init方法。其他方法也是同理。对于变量也是同样的道理。
class A:
def __init__(self):
self.a=”a”
self.b=”b”
def print(self):
print(self.a)
class B(A):
def __init__(self):
super(B,self).__init__() //注意继承书写的格式,类名写自己的类,self不能缺少。
self.c=”c”
def print_b(self):
print(self.b)
39、日期运算
import datetime,time
计算两个日期之间的差值:
date5 = datetime.datetime.strptime('2012-9-22 12:35:40','%Y-%m-%d %H:%M:%S')
date6 = datetime.datetime.strptime('2015-9-22 10:35:40','%Y-%m-%d %H:%M:%S')
sep = date6 - date5
print(sep)
计算三天之后的日期:
now = datetime.datetime.now()
delta = datetime.timedelta(days=3)
n_days = now + delta
print(n_days.strftime('%Y-%m-%d %H:%M:%S'))
其中strptime的类型是时间类,不是字符串格式。
date1 = time.ctime() #为字符串,不能进行加减运算
date2 = datetime.date.today() #为date类,能与timedelta进行运算
date3 = datetime.datetime.now() #为datetime类,能与timedelta进行运算
虽然都能与timedelta进行运算,但是不能的类之间不能进行运算,如date2-date3。
time.strptime(),datetime.datetime.strptime(),两者都是将字符串转换为时间类,但属于不同的类。
向一个开始输入框和结束输入框里输入时间,需要转换为string类型:
startTime = datetime.date.today()
startTimeStr = startTime.strftime()
endTime = startTime - datetime.tiemdelta(days=3)
endTimeStr = endTime.strftime()
40、日志模块
import logging
logging.basicConfig(filename="config.log",filemode="a",
format="%(asctime)s--%(name)s--%(levelname)s:%(message)s",level=logging.INFO)
console = logging.StreamHandler()
logging.getLogger().addHandler(console)
# 上面两行是将日志同时输出到console,方便调试。
logging.error("This is a error log.")
logging.info("This is a info log.")
41、python中的私有变量
(1)_xx,以单下划线开头的标识的protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标识为,如当使用 from M import * 时,不会将一个下划线开头的对象引入。
(2)__xx,双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)
(3)__xx__是定义特殊方法。用户控制的命名空间内的变量或是属性,如__init__,__import__或是__file__。只有当文档有说明时使用,不要自己定义这类变量。(就是说这些是python内部定义的变量名)
在这里强调一下私有变量,python默认的成员函数和成员变量都是公开的,没有像其他类似语言的public,private等关键字修饰,但是可以在变量前面加上两个下划线“__”,这样的话,函数或变量就变成私有的,这是python的已有变量轧压(这个翻译好拗口,英文名称是private name mangling)
42、列表表达式和列表生成器
列表推导式有包含一个表达式的括号组成,表达式后面跟随一个for字句,之后可以有零个或多个for或if字句,结果是一个列表,由表达式依据其后面的for或if字句上下文计算而来的结果构成
a = [(x,y) for x in [1,2,3] for y in [2,3,5] if x!=y]
这样,a就生成了一个列表,每个元素是由x、y构成的元组。
生成器表达式与列表表达式很像:m = ((x,y) for x in [1,2,3] for y in [2,3,5])
引用生成器表达式中的值:
print(m.__next__())
print(m.__next__())
总结:(1)把列表表达式的[]换成()得到的就是生成器表达式;(2)列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存。
43、列表中元素去重
列表有删除元素的方法,如list.pop(i),list.remove(value),del list[i]。有一点需要注意,每删除一个元素,后面的元素会自动前移一位,导致用for遍历的时候,每删除一个,后面的一个元素下标自动减1,使这个元素没被遍历到,从而出现遗漏。
要想删除列表中所有的重复元素,就不能简单的用for,而是用递归。如下:
list1 = [1,2,3,3,3,2,2,5,6,5,6]
def delDupli(list1):
for i in list1:
if list1.count(i) != 1:
list1.remove(i)
delDupli(list1)
delDupli(list1)
print(list1)