0%

ps: 解释全在代码里面了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python
# encoding: utf-8

"""
@author: Gamelife
@contact: fudenglong1417@gmail.com
@file: hhh.py
@time: 2017/4/26 22:04
"""


class MetaClass(type):

# __new__是方法其实是一个静态类方法,它的第一个参数是调用它的类自身,在本例中就是MetaClass本身
# 这里用mcs表示MetaClass,cls 表示类,self表示类实例
# 用于创建类实例,在本例中用于创建MetaClass的实例Child
def __new__(mcs, name, bases, dct):
print("元类中的__new__方法,用于创建%s实例" % name)
return super(MetaClass, mcs).__new__(mcs, name, bases, dct)
# return type(name, bases, dct),将导致不会继续调用Metaclass的__init__方法

# __init__方法用于初始化实例对象的属性,这里第一个参数用了cls,而不是self,是因为
# 元类是来创建类的,所以元类的实例其实是类,因此这里用了cls
def __init__(cls, *args, **kwargs):
print("元类__init__方法,用于实例化实例%s的属性" % cls.__name__)
super(MetaClass, cls).__init__(*args, **kwargs)

# __call__方法相当于重载()运算符,声明一个对象是可调用的
# __call__不是一个静态方法,不用像__new__方法一样声明第一个参数
# 对于元类的__call__方法,如果要继续生成实例,必须返回
def __call__(cls, *args, **kwargs):
print("类%s调用元类__call__方法" % cls.__name__)
return super(MetaClass, cls).__call__(*args, **kwargs)


class Child(metaclass=MetaClass):

def __init__(self):
print("Child实例__init__方法")

def __call__(self, *args, **kwargs):
print("%s实例是可调用的" % self.__class__.__name__)


class Another(metaclass=MetaClass):

# 一个实例的创建过程依次通过调用元类__call__,类自身__new__方法,类__init__方法
# __new__ 可以返回一个不是本来的实例,但是就不会继续调用__init__方法
def __new__(cls, *args, **kwargs):
print("Another类__new__方法")
return super(Another, cls).__new__(cls)

def __init__(self):
print("Another类实例__init__方法")

print("类是由元类创建的,元类是由元类创建的,这里MetaClass是由元类type创建的")

c = Child()
c()
a = Another()
# a(),但是Another的实例是不可调用的,因为Another类并没有实现__call__方法

程序输出:

    元类中的__new__方法,用于创建Child实例
    元类__init__方法,用于实例化实例Child的属性
    元类中的__new__方法,用于创建Another实例
    元类__init__方法,用于实例化实例Another的属性
    类是由元类创建的,元类是由元类创建的,这里MetaClass是由元类type创建的
    类Child调用元类__call__方法
    Child实例__init__方法
    Child实例是可调用的
    类Another调用元类__call__方法
    Another类__new__方法
    Another类实例__init__方法

参看文章:https://www.zhihu.com/question/38791962

总结有以下几点:

  1. 在Python中查看父类通过__bases__,查看类型通过__class__,判断实例通过isinstance,判断继承isubclass

  2. 在Python里面,所有的东西都是对象的概念,即使type和object

  3. type实例化自type类(isinstance(type, type) == True),type类继承自object(issubclass(type, object) == True;isinstance(type, object) == True

  4. object类没有继承自任何其他类(object.__bases__为空),object是type的实例(isinstance(object, type) == True

阅读全文 »

单例模式,顾名思义,程序运行期间,类只有一个示例存在

Python 中实现单例模式是通过控制类的创建进而控制对象的生成,因为Python中,所有,记着,所有都是对象,
看个例子吧就明白了

阅读全文 »

TCP通信过程三步骤:

建立TCP连接通道(三次握手)
数据传输
断开TCP连接通道(四次挥手)
阅读全文 »

原文看这里:原文

Vim 有三种编辑模式

  • 普通模式

    由shell进入vim编辑器时,例如执行命令:vim text.txt,首先进入的是普通模式。在普通模式下,从键盘输入的
    任何字符都被当做命令来解释。注意:普通模式下没有任何提示符,输入命令后立即执行,也不需要回车,而且输入的
    字符不会显示出来
    。例如,你可以使用键盘上的【上下左右】按键移动,使用dd删除整行

  • 编辑模式

    在普通模式你是不能进行编辑的,只有你在普通模式中按下【i,I,o,O,a,A,r,R】中的任意一个字符之后才会进入编辑模式,
    编辑模式主要用于文本的编辑。该模式下用户输入的任何字符都被作为文件的内容保存起来,并在屏幕上显示出来。

  • 在普通模式中,输入【:/?】这三个中任何一个字符后,光标将移动到最低那一行,然后输入你想要执行的命令,
    在命令模式下,用户可以对文件进行一些高级处理。尽管普通模式下的命令可以完成很多功能,
    但要执行一些如字符串查找、替换、显示行号等操作还是必须要进入命令模式。

阅读全文 »