Python小知识点总结

1. super()

在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super() 来实现:

class Animal(object):
    def __init__(self, name):
        self.name = name
    def greet(self):
        print ('Hello, I am %s.' % self.name)

class Dog(Animal):
    def greet(self):
        super(Dog, self).greet() 
        print ('WangWang...')

dog = Dog('dog')
dog.greet()

以上面代码为例,dog虽然直接调用的是Dog类,但是Dog类里调用了父类的方法,所以最后的输出应该是:

Hello, I am dog.

WangWang…

super 的一个最常见用法是在子类中调用父类的初始化方法:

class Base(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

class A(Base):
    def __init__(self, a, b, c):
        super(A, self).__init__(a, b)  # 或是super().__init__(a, b)
        self.c = c

但是super和父类没有实质性的关联,只是上面恰好获取了父类并调用了父类的方法,深入了解super()参考:
Python: 你不知道的 super

2. 如何理解Python代码“if __name__ == ‘__main__’”

简单来说,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。

在知乎上看到一个比较有意思的讲解:

假设你是(小明.py)

朋友眼中你是小明(__name__ == ‘小明’),

你自己眼中你是你自己(__name__ == ‘__main__’),

你编程很好, 朋友调你去帮他写程序(import 小明, 这时你在朋友眼中: __name__ == ‘小明’),

但你晚上也会打开xx网站, 做一些自己的事情,直接运行(小明.py), 这时在你眼中:__name__ == ‘__main__’

来源:知乎_铭尚hkyue

更详细的解释可以参考这篇文章:Python 中的 if __name__ == ‘__main__’ 该如何理解

3. 为什么时间戳从1970年算起

在命令行输入如下代码

import time

time.time()

会得到一个十几亿大小的浮点数,这个结果的含义是1970纪元后到现在经过的浮点秒数,这个不只是在Python中,在别的一些语言中也是以1970年作为时间戳的起点,为什么?

1969年UNIX第一个版本发布, 第一个版本的 Unix time 用一个32位整数存储,基于硬件60Hz的时间计数。

1971年11月3号出版的《Unix Programmer’s Manual》第一版里定义了 UNIX TIME 以 1971年1月1日00:00:00 作为起始时间,每秒增长60。

后来考虑到32位整数的范围,如果每秒增长60个数字,则两年半就会循环一轮了。

于是改成了1Hz时间计数。这个循环周期大约有136年之久,就不在乎起始时间是1970还是1971年了,于是为了人工记忆和计算的方便就改为了1970年。

补充:因为 UNIX TIME 是一个有符号整数,所以1970年前一百年可以用其负数部分表示。但事实上很少这样使用。UNIX TIME 主要用来表示当前时间或者和电脑有关的日志时间。考虑到所有电脑文件不可能在1970年前创立,所以用 UNIX TIME 很少用来表示1970前的时间。当需要表示以前的时间,一般就是自己定义数据结构。比如你可以用几个数分别表示年月日。

4.Python中的’__init__()’和’__del__()’

创建对象后,python解释器默认调用“__init__()”方法;
当删除一个对象时,python解释器也会默认调用一个方法,这个方法为“__del__()”方法,但是并不是每次删除对象都会调用该方法。

__init__()见得比较多,这里只特别说明一下__del__(),以代码为例:

import time

class Animal(object):

    def __init__(self, name):
        print('__init__方法被调用')
        self.__name = name

    def __del__(self):
        print("__del__方法被调用")
        print("%s对象马上被干掉了..." % self.__name)

# 创建对象
dog = Animal("哈皮狗")
# 删除对象
del dog

cat = Animal("波斯猫")
cat2 = cat

print("马上 删除cat对象")
del cat

print("马上 删除cat2对象")
del cat2

print("程序2秒钟后结束")
time.sleep(2)

对于上面这段程序,它的输出结果为:

__init__方法被调用
__del__方法被调用
哈皮狗对象马上被干掉了…
__init__方法被调用
马上 删除cat对象
马上 删除cat2对象
__del__方法被调用
波斯猫对象马上被干掉了…
程序2秒钟后结束

我们注释掉下面这段程序:

# del cat2

得到如下结果:

__init__方法被调用
__del__方法被调用
哈皮狗对象马上被干掉了…
__init__方法被调用
马上 删除cat对象
马上 删除cat2对象
程序2秒钟后结束
__del__方法被调用
波斯猫对象马上被干掉了…

加入我们把所有的del语句注释掉:

# del dog
# del cat
# del cat2

又会得到如下结果:

__init__方法被调用
__init__方法被调用
马上 删除cat对象
马上 删除cat2对象
程序2秒钟后结束
__del__方法被调用
哈皮狗对象马上被干掉了…
__del__方法被调用
波斯猫对象马上被干掉了…

由此,我们可以得到”__del__()”调用的逻辑:

执行del之后如果引用计数等于0,则会立即调用__del__()。 - - - - >对应于示例1中的 del dog
执行del之后如果引用计数不等于0,则会在所有程序执行完后自动调用__del__()。- - - - >对应于示例2
如果没有del语句,当所有的程序执行完之后,__del__()会自动被调用,用来清理实例对象,回收内存。- - - - >对应于示例3

5. str.format() 函数

大多数情况下,str.format()和格式化操作符功能相似,这个总结得不错:str.format() 函数

6.未完待续…

你可能感兴趣的:(Python)