转贴来自&刘鑫的专栏 pickle——python对象的串行化
最近感觉自己虽然玩了3年多的python,但仅仅停留在使用的阶段上,对python的很多内容还不算很了解,打算沉下心来,扎扎实实的学些东西了。
对象的串行化感觉上是很有用的(但自己很少用到),不过还是好好学习下吧。
1)相关的python模块
在python 3.0里,和python相关的模块主要有2个:_pickle,marshal.
其中_pickle是对pickle的优化,是使用C语言对底层进行了一部分的优化。
marshal是python里原生的串行化类,但是在使用上pickle更加优秀,marshal的存在主要是为了支持python的*.pyc文件。
pickle模块和marshal模块有几方面的差别:
1>pickle模块对已串行化的对象进行跟踪,因此对同一个对象的引用不需要再次串行化。marshal不这么做。
对于循环对象而言,他们包括对自己的引用,因此marshal不支持循环对象。
共享对象由于是指有多个实例指向同一个引用,pickle保存一个引用,并使得其他实例都指向该对象,来保证所有实例的一致性。
2>marshal不能用来串行化用户自定义对象和它们的实例。pickle可以串行化这些对象,但前提是类的定义是可以引入的,并且和对象串行化的类在一个模块里。
3>marshal不能跨版本,因为它主要是用来支持*.pyc文件的,解释器不需要保持对以前版本的兼容性。而pickle可以做到这一点。
2)用法
pickle.dump(obj, file[, protocol])
pickle.dumps(obj[, protocol])
pickle.load(file[, *, encoding="ASCII", errors="strict"])
pickle.loads(bytes_object[, *, encoding="ASCII", errors="strict"])
3)异常
exception pickle.PickleError 基本的Error,从Exception继承而来
exception pickle.PicklingError 当一个不支持Pickle的对象被pickle被激发
exception pickle.UnpicklingError Unpickle出错时被激发,例如数据损坏或安全问题
4)可以被pickle的对象
None,True,False
数字,复数
字符串,字符集
元组,列表,集合,字典
模块的顶层函数、内置函数、类
Welcome to my blog! You can find the useful information about Windows PC, MAC, Linux and iDevice(iPhone iPod iPad).
2010年3月2日星期二
2010年1月12日星期二
转:wxpython 换肤
原文:http://wiki.woodpecker.org.cn/moin/flyaflya
如果只用通用控件(不用Panel),可以实现完美换肤....
如果只用通用控件(不用Panel),可以实现完美换肤....
对newedit进行换肤,好玩....
原理是用win32com调用ActiveSkin实现的,因为wxpython的控件是native的,加上ActiveSkin支持COM,我也是突发奇想试了一下,想不到成功了,不过ActiveSkin是商业组件,而且现在已经停了,想买都没法买了,只有用盗版,而且只能在windows下用,有一些控件也不能很好支持,问题太多,所以我一直没公开这个技术,后来我试了很多支持COM的换肤控件包,都不关用。现在有人问起这个问题,就说一下。只需要增加三行代码。 需要安装:ActiveSkin43.rar
切换行号显示
1 import wx, win32com.client 2 .... 3 class MyApp(wx.App): 4 def OnInit(self): 5 self.skinLib = win32com.client.Dispatch("ActiveSkin4.Skin2") #载入ActiveSkin 6 self.skinLib.LoadSkin("Paper.skn") #载入皮肤 7 frame = MyFrame(None, "Simple wxPython App") 8 self.SetTopWindow (frame) 9 self.skinLib.ApplySkin(frame.GetHandle()) #使用皮肤 -- flyaflya [2005-08-04 09:45:16]
2009年6月25日星期四
Python视频教程--(设置环境变量)Adding Python to DOS Path
自己作为一个PYthon的初学者,更能够理解一些初学者的迷惑的心情,和渴望有一个高手能给自己演示操作一下。这样或许能帮助我们更好的理解某些书面文字,今天上网搜到一个视频教程网,虽然是英文的但有些操作是可以看的,所以推荐给网友看看。
直接点击下面网址,进入网站在线观看。
直接点击下面网址,进入网站在线观看。
视频所在网址: 'Adding Python to DOS Path'
at ShowMeDo from the Python category.
2009年6月24日星期三
wxpython demo labelbook学习心得
今天终于完成了一个自己第一个代码的完善工作--一个wxpython的demo labelbook的学习代码。
作为纪念想把代码写入博客,也算是给网友一个分享吧。
再此也要感谢python-cn`CPyUG`华蟒用户组(中文Py用户组)中一个叫汪文进的网友,他给了我很大的帮助使得我能够顺利完成。
程序代码如下:
import wx
import wx.lib.colourselect as csel
import os
import sys
try:
dirName = os.path.dirname(os.path.abspath(__file__))
except:
dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
bitmapDir = os.path.join(dirName, 'images')
sys.path.append(os.path.split(dirName)[0])
try:
from agw import labelbook as LB
from agw.fmresources import *
except ImportError: # if it's not there locally, try the wxPython lib.
import wx.lib.agw.labelbook as LB
from wx.lib.agw.fmresources import *
#import images
_pageTexts = ["Hello", "From", "wxPython", "LabelBook", "Demo"]
#_pageIcons = []
_pageIcons = ["roll.png", "charge.png", "add.png", "decrypted.png", "news.png"]
#_pageIcons = ["icon-equiv.png","icon-minimiz.png","icon-product.png","icon-setup.png","product4x.png"]
_pageColours = [wx.RED, wx.GREEN, wx.WHITE, wx.BLUE, "Pink"]
class LabelBook(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.mainpanel = wx.Panel(self, -1)
self.SetProperties()
self.CreateLabelBook()
self.DoLayout()
self.SetSize((600,500))
#self.SetIcon(images.Mondrian.GetIcon())
self.CenterOnScreen()
#self.initializing = False
self.SendSizeEvent()
def SetProperties(self):
self.SetTitle("The success labelbook!-)")
def DoLayout(self):
mainsizer = wx.BoxSizer(wx.VERTICAL)
panelsizer = wx.BoxSizer(wx.VERTICAL)
panelsizer.Add(self.book, 1, wx.EXPAND, 0)
self.mainpanel.SetSizer(panelsizer)
panelsizer.Layout()
mainsizer.Add(self.mainpanel, 1, wx.EXPAND, 0)
self.SetSizer(mainsizer)
mainsizer.Layout()
self.Layout()
def CreateLabelBook(self):
style = self.GetBookStyles()
self.book = LB.LabelBook(self.mainpanel, -1,style=style)
#self.book = LB.FlatImageBook(self.mainpanel, -1, style=style)
self.imagelist = self.CreateImageList()
self.book.AssignImageList(self.imagelist)
#self.Refresh()
for indx, txts in enumerate(_pageTexts):
#label = "This is panel number %d"%(indx+1)
self.book.AddPage(TestPanel(self.book,_pageColours[indx]),
txts, True, indx)
self.book.SetSelection(0)
#self.book.SetWindowStyleFlag(style=LB.INB_FIT_BUTTON)
self.SendSizeEvent()
def GetBookStyles(self):
style = INB_FIT_BUTTON
style |= LB.INB_FIT_LABELTEXT
#style |= INB_WEB_HILITE
style |= INB_USE_PIN_BUTTON
#style |= INB_BORDER
#style |= LB.INB_SHOW_ONLY_TEXT #only used in FlatImageBook type
style = self.GetBookOrientation(style)
return style
def CreateImageList(self):
imagelist = wx.ImageList(32, 32)
for img in _pageIcons:
newImg = os.path.join(bitmapDir, "lb%s"%img)
bmp = wx.Bitmap(newImg, wx.BITMAP_TYPE_PNG)
imagelist.Add(bmp)
#bmp = imagebmp.GetBitmap()
#for i in range(5):
# imagelist.Add(bmp)
return imagelist
def GetBookOrientation(self, style):
style |= INB_LEFT
#style |= INB_RIGHT
#style |= LB.INB_TOP #only used in FlatImageBook type
#style |= INB_BOTTOM #only used in FlatImageBook type
return style
#---------------------------------------------------------------------------
class TestPanel(wx.Panel):
def __init__(self, parent,colour):
#self.log = log
wx.Panel.__init__(self, parent, -1)
st = wx.StaticText(self, -1,
"You can put nearly any type of window here,\n"
"and if the platform supports it then the\n"
"tabs can be on any side of the notebook.",
(10, 10))
b = wx.Button(self, -1, " Test LabelBook And FlatImageBook ", (100,100))
self.Bind(wx.EVT_BUTTON, self.OnButton, b)
self.SetBackgroundColour(colour)
def OnButton(self, evt):
msg= "this is a botton!"
dlg = wx.MessageDialog(self,msg,"this my test",wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = LabelBook(None)
frame.Show()
app.MainLoop()
作为纪念想把代码写入博客,也算是给网友一个分享吧。
再此也要感谢python-cn`CPyUG`华蟒用户组(中文Py用户组)中一个叫汪文进的网友,他给了我很大的帮助使得我能够顺利完成。
程序代码如下:
import wx
import wx.lib.colourselect as csel
import os
import sys
try:
dirName = os.path.dirname(os.path.abspath(__file__))
except:
dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
bitmapDir = os.path.join(dirName, 'images')
sys.path.append(os.path.split(dirName)[0])
try:
from agw import labelbook as LB
from agw.fmresources import *
except ImportError: # if it's not there locally, try the wxPython lib.
import wx.lib.agw.labelbook as LB
from wx.lib.agw.fmresources import *
#import images
_pageTexts = ["Hello", "From", "wxPython", "LabelBook", "Demo"]
#_pageIcons = []
_pageIcons = ["roll.png", "charge.png", "add.png", "decrypted.png", "news.png"]
#_pageIcons = ["icon-equiv.png","icon-minimiz.png","icon-product.png","icon-setup.png","product4x.png"]
_pageColours = [wx.RED, wx.GREEN, wx.WHITE, wx.BLUE, "Pink"]
class LabelBook(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.mainpanel = wx.Panel(self, -1)
self.SetProperties()
self.CreateLabelBook()
self.DoLayout()
self.SetSize((600,500))
#self.SetIcon(images.Mondrian.GetIcon())
self.CenterOnScreen()
#self.initializing = False
self.SendSizeEvent()
def SetProperties(self):
self.SetTitle("The success labelbook!-)")
def DoLayout(self):
mainsizer = wx.BoxSizer(wx.VERTICAL)
panelsizer = wx.BoxSizer(wx.VERTICAL)
panelsizer.Add(self.book, 1, wx.EXPAND, 0)
self.mainpanel.SetSizer(panelsizer)
panelsizer.Layout()
mainsizer.Add(self.mainpanel, 1, wx.EXPAND, 0)
self.SetSizer(mainsizer)
mainsizer.Layout()
self.Layout()
def CreateLabelBook(self):
style = self.GetBookStyles()
self.book = LB.LabelBook(self.mainpanel, -1,style=style)
#self.book = LB.FlatImageBook(self.mainpanel, -1, style=style)
self.imagelist = self.CreateImageList()
self.book.AssignImageList(self.imagelist)
#self.Refresh()
for indx, txts in enumerate(_pageTexts):
#label = "This is panel number %d"%(indx+1)
self.book.AddPage(TestPanel(self.book,_pageColours[indx]),
txts, True, indx)
self.book.SetSelection(0)
#self.book.SetWindowStyleFlag(style=LB.INB_FIT_BUTTON)
self.SendSizeEvent()
def GetBookStyles(self):
style = INB_FIT_BUTTON
style |= LB.INB_FIT_LABELTEXT
#style |= INB_WEB_HILITE
style |= INB_USE_PIN_BUTTON
#style |= INB_BORDER
#style |= LB.INB_SHOW_ONLY_TEXT #only used in FlatImageBook type
style = self.GetBookOrientation(style)
return style
def CreateImageList(self):
imagelist = wx.ImageList(32, 32)
for img in _pageIcons:
newImg = os.path.join(bitmapDir, "lb%s"%img)
bmp = wx.Bitmap(newImg, wx.BITMAP_TYPE_PNG)
imagelist.Add(bmp)
#bmp = imagebmp.GetBitmap()
#for i in range(5):
# imagelist.Add(bmp)
return imagelist
def GetBookOrientation(self, style):
style |= INB_LEFT
#style |= INB_RIGHT
#style |= LB.INB_TOP #only used in FlatImageBook type
#style |= INB_BOTTOM #only used in FlatImageBook type
return style
#---------------------------------------------------------------------------
class TestPanel(wx.Panel):
def __init__(self, parent,colour):
#self.log = log
wx.Panel.__init__(self, parent, -1)
st = wx.StaticText(self, -1,
"You can put nearly any type of window here,\n"
"and if the platform supports it then the\n"
"tabs can be on any side of the notebook.",
(10, 10))
b = wx.Button(self, -1, " Test LabelBook And FlatImageBook ", (100,100))
self.Bind(wx.EVT_BUTTON, self.OnButton, b)
self.SetBackgroundColour(colour)
def OnButton(self, evt):
msg= "this is a botton!"
dlg = wx.MessageDialog(self,msg,"this my test",wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = LabelBook(None)
frame.Show()
app.MainLoop()
订阅:
博文 (Atom)