概念:

  并行:同时运行

  并发:看似同时运行

 json后任然中文的问题

import json

d = {"名字":"初恋这件小事"}

new_d1 = json.dumps(d)

new_d = json.dumps(d, ensure_ascii=False)

print(new_d1)
print(new_d)

变量说明

xx: 公有变量
_x:私有方法或属性,不可以通过 from somemodule import * 的方式导入,但是可以通过 import somemodule ,通过 somemodule._x的方式来调用
__xx:无法在外部直接访问,类似于上面那个, 在类里面的时候,python偷偷的把这种方法变量改了名字 _函数名__变量名 可以通过 dir(对象) 来查看
__xx__:如 __init__, 不要发明这样的名字
xx_:用于避免与 Python 关键词冲突, 不推荐

类相关

静态方法:
  存在于类中的普通方法,对象调用的时候,不会自动往里面传递 self 的参数,,但是如果不主动往里面传递self(对象)的时候,那就不能调用 self.属性(方法)了
只是名义上属于类
类方法:
  这个方法里面只能访问类变量(引用的时候也是要写self.变量),不能访问实例变量。

get/set方法的升级---版本一

 #! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Always"
# Date: 2017/7/2 # propetry的使用 class Test(object):
def __init__(self):
self.__num = 100 def getNum(self):
print("++++++++++++getNum++++++++++++")
return self.__num def setNum(self, newNum):
print("++++++++++++setNum++++++++++++")
self.__num = newNum num = property(getNum, setNum) # 位置参数(self, fget=None, fset=None, fdel=None, doc=None),get 在前面, set在后面 t = Test() print(t.getNum()) t.setNum(200) # 正常情况下,都是这么调用
print(t.getNum()) t.num = 50 # 使用 property 后,将get、set设置成了属性,这样的话,调用起来就比较方便了。可以直接使用 print(t.num)

get/set升级版本一

get/set方法的升级---版本二

 # Date: 2017/7/2

 # propetry的使用

 class Test(object):
def __init__(self):
self.__num = 100 # get写前面,set写后面,两个函数名字一样,函数名为后面的取值依据,个体前面写 property,set写 函数名.setter
@property
def num(self):
print("++++++++++++getNum++++++++++++")
return self.__num @num.setter
def num(self, newNum):
print("++++++++++++setNum++++++++++++")
self.__num = newNum @num.deleter
def num(self):
print("++++++++++++deNum++++++++++++")
del self.__num # 话句话说, 前面加 property 的时候,就把这个函数变成了一个属性(变量) 这样的话,代表可以直接执行
# 这种情况下如果遇到有参数的时候,传参数可以参考 setter 这个赋值的操作,也就是,写两个咯。。。多试大兄弟
t = Test() t.num = 50
print(t.num) del t.num # 通过这个可以删除 __num 这个私有属性 # 上面就是三个属性的装饰器
# 通常可以只提供一个查询的结果的接口给别人(这个函数里面可可以添加好多的流程)

get/set升级版本二

python语言的动态性,即可以给类和对象动态的添加方法和属性

 #! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Always"
# Date: 2017/7/2 import types class Person(object):
def __init__(self, newName, newAge):
self.name = newName
self.age = newAge p1 = Person("p1", 18) p1.sex = "male" def run(self):
print("%s can run..."%self.name) p1.run = types.MethodType(run, p1) # 给对象添加方法
# 后面那句话的主要意思是,将 p1 与 run 绑定到一起,下次执行 run 的时候,自动把 p1 传进去
# 这句话的意思是,将后面得到的一个返回结果给前面的 p1 中的 run 这个变量,当然了,前面p1.run
# 也可以换成任意的变量名,下次可以通过这个变量名来调用这个函数,但是没什么意义 print(p1.sex)
p1.run() @staticmethod
def hehe():
print("给类添加静态方法") Person.hehe = hehe # 给类添加静态方法 Person.hehe()
p1.hehe() @classmethod
def fire(fir):
print("给类添加类方法") Person.fire = fire Person.fire() p1.fire()

类和方法动态添加属性和方法

禁止添加动态方法

 #! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Always"
# Date: 2017/7/2 class Person(object):
__slots__ = ("name", "age", "sex") p1 = Person() p1.name = 'zhang'
p1.age = 18
p1.sex = 'male' print(p1.name, p1.age, p1.sex) class Person(object):
__slots__ = ("name", "age", "sex") def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex p1 = Person('zhang', 18, 'male') print(p1.name, p1.age, p1.sex) # 试过了,__slote__ 不可以放在 __init__ 里面

禁止添加动态方法

类做装饰器,其实原理和 函数 做装饰器原理差不多

 #! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Always"
# Date: 2017/7/2 class Outer(object):
def __init__(self, func):
print("---类做装饰器,初始化---")
print("func name is %s"%func.__name__)
self.__func = func def __call__(self, *args, **kwargs):
print("---装饰器里面的功能---")
self.__func() @Outer
def foo():
print("---foo---") foo()

实例一

 # __call__ 这个函数,可以通过 实例的对象的本来来调用这个函数,所以说,这个就可以把类来用作装饰器了
# of couse,这个函数是可以有返回值的
class Person(object):
def __init__(self, name):
self.name = name def __call__(self, *args, **kwargs):
print(self.name)
return '' p1 = Person('zhang') print(p1())

可以有返回值

断点调试

这个是写完了的情况下
python -m pdb test1.py l---->list 显示当前的代码
n---->next 向下执行一行代码
c---->continue 继续执行代码 在这个模式中,使用 b 可以添加端点
>>b 意思是在第七行添加端点
>>b 可以看到所有断点及序号
>>clear 断点序号 删除 b---->break 添加端点 clear--> 删除断点 在call(函数)的时候,敲 s 回车,然后再 l,进入 call 里面执行 p a--->step 查看 a 变量的值 a--->args 查看所有形参的数据 q---->quit 退出调试 r---->return 快速执行道函数的最后一行
 #! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Always"
# Date: 2017/7/2 import pdb def add(a,b):
c = a + b
return c pdb.run("add(3,4)") # 注意书写方式,括号里面是 引号,意思是让 pdb.run 来调用它,执行后 先输入 s 进入这个函数里面 #==============另一种方法,文件里面下断点-程序里埋点,遇到就开始调试--------------- def sub(a,b):
c = a - b
return c pdb.set_trace()
ret = sub(3, 2) # 直行道这里开始调试模式
print(ret)

其它两种断点使用方法

多任务

 yield实现协程

 #! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Always"
# Date: 2017/7/2 def fun1():
while True:
print("--1--")
yield None # 可以没有返回值 def fun2():
while True:
print("--2--")
yield None f1 = fun1()
f2 = fun2() while True:
next(f1)
next(f2)

实现多进程

import os

res = os.fork()--->主进程得到的值大于0, 子进程得到的值为0
print('heheh')

 #coding:utf-8

 import os

 res = os.fork()

 if res:
while True:
print("Are you OK?")
else:
while True:
print("I am OK")

# 上面的 os.fork 会创建一个新的进程,执行下面的代码。
# 也就是说,print 会被执行两次
# os.fork() 会返回两次,一次是 0, 和其它,因为新的进程也要从这里往下走
# 这样的话就相当于执行了两次下面的流程。你可以判断返回值,让它执行两个内容
# 这个方法只可以在非 Windows 上面执行,如:linux, windows不支持这个
# 主进程结束后,子进程不会被杀死
# 缺点,占得资源比较大

os.getpid() ---> 进程 id
os.getppid() ---> 父进程 id

 #coding:utf-8

 import os
import time a = 100 res = os.fork() if res:
for i in range(100):
print(a)
a -= 1
time.sleep(0.01)
else:
for i in range(100):
print(a)
a += 1
time.sleep(0.01)
print("The last value:",a)

# 前面的结果我忽略了,直接看最后的结果吧
>>> The last value: 0
>>> The last value: 200

# 这说明了,多进程之间的全局变量是不共享的,其实很容理解,这两个已经相当于独立了。。。。

# 后期学习进程间的通信

# 进程后面再接 fork 的话,那么就相当于再执行 两次(主进程一次,子进程一次)

例:
  os.fork()
  os.fork()
  os.fork()
  print("----1----")
会被打印8次

======解决windows不能用的问题======
可以用于 windows 以及 linux,由模块的接口来调用,更具不同的电脑

from multiprocessing import Process
用这个方法,主进程会等待所有子进程结束

windows 比较奇怪,windows在起线程的时候需要把 start 放在 __name__ 里面,这是由于操作系统机制不同导致的,windows在起这个进程的时候,会导入这个文件,读取这个文件,如果不放在 __name__ 里面的话,就会进入无线起新进程的状态,所以会报错。

 # ! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Always"
# Date: 2017/7/2 from multiprocessing import Process, freeze_support
import time def foo():
for i in range(5):
print("---foo---")
time.sleep(1) def main():
for i in range(5): # 主程序继续执行
print("---main---")
time.sleep(1) if __name__ == "__main__":
freeze_support() # 那啥,我也不知道为什么加这个,不加反正也没事,等到讲到的时候重新做笔记吧
p = Process(target=foo) # 创建一个对象,让后,将函数赋值给 target
p.start() # 调用对象的方法,开始执行 foo 函数里面的代码 p.join() # 阻塞,等到子进程结束后,主程序才会继续往下走
# 里面可以写个时间,如果到达这个秒数还没结束,那么主程序往后走 p.terminate() # 不管子程序有没有结束,都kill掉它 main()

20170702-变量说明,静态方法,类方法区别,断点调试,fork,yield协程,进程,动态添加属性等。。的更多相关文章

  1. python类的实例方法\静态方法\类方法区别解析(附代码)

    前言 搞了好久python,一直搞得不太清楚这几种类的方法,今天花时间好好测试一下,算是弄懂点皮毛吧. 三种方法的不同 先剽窃个图看一下 可以看到,实例是三种方法都可以调用的,而类只可以调用两种.所以 ...

  2. Visual Studio Code 调试 nodejs (断点调试、自动重启、进程调试)

    学习链接: https://cnodejs.org/topic/5a9661ff71327bb413bbff5b https://github.com/nswbmw/node-in-debugging ...

  3. IT第七天 - 类及其属性、方法的理解,断点调试初识,代码优化总结,编程逻辑培养

    IT第七天 上午 类 1.对象:是多个实体抽象出来的共同点集合,对象包括:属性(即实体的特征).方法(即尸体的功能作用) 2.程序中,用类来模拟对象 3.类是抽象的,是对象的类型,是将多个拥有相同属性 ...

  4. python 进程、线程与协程的区别

    进程.线程与协程区别总结 - 1.进程是计算器最小资源分配单位 - 2.线程是CPU调度的最小单位 - 3.进程切换需要的资源很最大,效率很低 - 4.线程切换需要的资源一般,效率一般(当然了在不考虑 ...

  5. python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  6. Java学习日记基础(五)——类、对象之this、静态变量(类变量)、静态方法(类方法)、四大特征

    this 赵本山问奥尼尔:“我的爸爸的爸爸是谁?” 奥尼尔:“不知道” 赵本山:“你傻啊,是我爷爷” 奥尼尔回去问科比:“我的爸爸的爸爸是谁?” 科比:“不知道” 奥尼尔:”你傻啊,是赵本山的爷爷“ ...

  7. Lua中如何实现类似gdb的断点调试--02通用变量打印

    在前一篇01最小实现中,我们实现了Lua断点调试的的一个最小实现.我们编写了一个模块,提供了两个基本的接口:设置断点和删除断点. 虽然我们已经支持在断点进行变量的打印,但是需要自己指定层数以及变量索引 ...

  8. Visual Studio断点调试, 无法监视变量, 提示无法计算表达式

    在使用Visual Studio 2012进行断点调试时,对某个变量添加监视,出现"无法计算表达式"的提示. 解决办法:依次点击菜单栏中的"调试"→" ...

  9. swift OC混编工程,xcode断点调试,控制台左侧只有变量名称不显示值,右侧输入po命令,打印除一堆提示

    断点调试 (lldb) po 变量名warning: Swift error in module 项目名.Debug info from this module will be unavailable ...

随机推荐

  1. 【gcc】更新下载编译gcc遇到的各种问题

    帮学长的oj升级gcc版本.遇到了贼多问题.. [悲惨的开始] 安装gcc版本推荐ustc的mirror的下载,超快der... https://mirrors.ustc.edu.cn/gnu/gcc ...

  2. TOP和PS aux命令显示出来的栏目所代表的意思

    USER: 行程拥有者 PID: pid %CPU: 占用的 CPU 使用率 %MEM: 占用的记忆体使用率 VSZ: 占用的虚拟记忆体大小 RSS: 占用的记忆体大小 TTY: 终端的次要装置号码 ...

  3. C/C++通用Makefile

    最近的项目又回到了Linux上运行,这就需要在Linux下编译项目,写Makefile针对习惯了Windows的程序员来说是一件痛苦的事,如果有一个通用的Makefile该多好啊,本着这样的目的,我再 ...

  4. 【JZOJ6409】困难的图论

    description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在这个环中被 ...

  5. Change myself to be better

    发现和改变自己不好的习惯 遇到问题的反应 自己遇到问题的时候,特别是不熟悉的问题的时候就会有点焦虑,这个应该是每个人都会有的,遇到自己不熟悉的或者是没有经历过的东西都会 感觉不舒服,或者是遇到难题或者 ...

  6. .net API跨域

    在webconfig中的节点 <system.webServer> </system.webServer> 下添加 <httpProtocol><custom ...

  7. Delphi Xml

    用递归方法,使用 xml 文档生成 Treeview 树形视图.由于是动态生成,所以可以通过修改 xml 的逻辑来定制 Treeview 的结构,从而实现了 xml 对 Treeview 的动态配置, ...

  8. NX二次开发-UFUN创建固定的基准平面UF_MODL_create_fixed_dplane

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建块 UF_FEATURE_SIGN ...

  9. Photon Server的服务器端配置

    Photon Server与Unity3D的交互分为3篇博文实现 (1)Photon Server的服务器端配置 (2)Photon Server的Unity3D客户端配置 (3)Photon Ser ...

  10. (转)C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播

    转:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RT ...