下面小编给大家整理的Python中使用装饰器和元编程实现结构体类实例,本文共6篇,欢迎阅读与借鉴!

篇1:Python中使用装饰器和元编程实现结构体类实例
Python中使用装饰器和元编程实现结构体类实例,本文的方法算是一种Python的黑魔法技术,并非Python的常规写法,需要的朋友可以参考下
Ruby中有一个很方便的Struct类,用来实现结构体,这样就不用费力的去定义一个完整的类来仅仅用作访问属性。
代码如下:
class Dog < Struct.new(:name, :age)
end
fred = Dog.new(“fred”, 5)
printf “name:%s age:%d”, fred.name, fred.age
##name:fred age:5
Python3.4中也可以这么干,但写法很累赘。其中包含self.name = name 这种很烦人的写法。
代码如下:
class Dog(object):
def __init__(self, name, age):
self.name = name
self.age = age
fred = Dog(“fred”, 5)
print(‘name:{name} age:{age}‘.format(name=fred.name, age=fred.age))
##name:fred age:5
想到我大Python是无所不能的,有没有一种简化结构体类属性定义的方法呢?答案肯定是有的,
在补习了一些Python黑魔法技术后,我想到利用装饰器函数和元编程技术来实现。
代码如下:
def struct(*name):
“”“ 装饰器函数
用途:用于在类定义中,自动设置self.value = value
”“”
def decorator(func):
def wrapper(*args, **kw):
for i in range(len(name)):
setattr(args[0], name[i], args[i+1])
return func(*args, **kw)
return wrapper
return decorator
class Dog(object):
@struct(‘name‘,‘age‘) #黑魔法所在!
def __init__(self, *all_value):
pass
fred = Dog(“fred”, 5)
print(‘name:{name} age:{age}‘.format(name=fred.name, age=fred.age))
##name:fred age:5
要注意的是,这种写法会造成代码结构的不清晰。
篇2:Python实现类继承实例
-05-05ssh批量登录并执行命令的python实现代码
-02-02python登录QQ邮箱发信的实现代码
2013-03-03python中定义结构体的方法
2012-08-08Python模块学习filecmp 文件比较
-02-02python实现ftp客户端示例分享
2014-04-04Python操作sqlite3快速、安全插入数据(防注入)的实例
2014-05-05Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2013-12-12python批量修改文件后缀示例代码分享
2013-12-12python获取beautifulphoto随机某图片代码实例
2014-02-02python基础教程之udp端口扫描
篇3:Python实现类继承实例
最近更 新
在Windows8上的搭建Python和Django环境
python获取网页状态码示例
python 判断自定义对象类型
使用python在校内发人人网状态(人人网看状
python抓取网页图片并放到指定文件夹
python实现socket端口重定向示例
python二分法实现实例
python解析xml模块封装代码
windows下python模拟鼠标点击和键盘输示例
python访问sqlserver示例
热 点 排 行
Python入门教程 超详细1小时学会
python 中文乱码问题深入分析
比较详细Python正则表达式操作指
Python字符串的encode与decode研
Python open读写文件实现脚本
Python enumerate遍历数组示例应
Python 深入理解yield
Python+Django在windows下的开发
python 文件和路径操作函数小结
python 字符串split的用法分享
篇4:Python的迭代器和生成器使用实例
这篇文章主要介绍了Python的迭代器和生成器使用实例,本文讲解了迭代器的next方法、__iter__方法和实例以及生成器的代码实例,需要的朋友可以参考下
一、迭代器Iterators
迭代器仅是一容器对象,它实现了迭代器协议,它有两个基本方法:
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身
迭代器可使用内建的iter方法创建,见例子:
代码如下:
>>> i = iter(‘abc‘)
>>> i.next
‘a‘
>>> i.next()
‘b‘
>>> i.next()
‘c‘
>>> i.next()
Traceback (most recent call last):
File “
StopIteration:
class MyIterator(object):
def __init__(self, step):
self.step = step
def next(self):
“”“Returns the next element.”“”
if self.step==0:
raise StopIteration
self.step-=1
return self.step
def __iter__(self):
“”“Returns the iterator itself.”“”
return self
for el in MyIterator(4):
print el
--------------------
结果:
代码如下:
3
2
1
0
二、生成器Generators
从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。
它基于yield指令,允许停止函数并立即返回结果。
此函数保存其执行上下文,如果需要,可立即继续执行。
例如Fibonacci函数:
代码如下:
def fibonacci():
a,b=0,1
while True:
yield b
a,b = b, a+b
fib=fibonacci()
print fib.next()
print fib.next()
print fib.next()
print [fib.next() for i in range(10)]
--------------------
结果:
代码如下:
1
1
2
[3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
PEP Python Enhancement Proposal Python增强建议
tokenize模块
代码如下:
>>> import tokenize
>>> reader = open(‘c:/temp/py1.py‘).next
>>> tokens=tokenize.generate_tokens(reader)
>>> tokens.next()
(1, ‘class‘, (1, 0), (1, 5), ‘class MyIterator(object):/n‘)
>>> tokens.next()
(1, ‘MyIterator‘, (1, 6), (1, 16), ‘class MyIterator(object):/n‘)
>>> tokens.next()
(51, ‘(‘, (1, 16), (1, 17), ‘class MyIterator(object):/n‘)
例子:
代码如下:
def power(values):
for value in values:
print ‘powering %s‘ %value
yield value
def adder(values):
for value in values:
print ‘adding to %s‘ %value
if value%2==0:
yield value+3
else:
yield value+2
elements = [1,4,7,9,12,19]
res = adder(power(elements))
print res.next()
print res.next()
--------------------
结果:
代码如下:
powering 1
adding to 1
3
powering 4
adding to 4
7
保持代码简单,而不是数据,
注意:宁可有大量简单的可迭代函数,也不要一个复杂的一次只计算出一个值的函数。
例子:
代码如下:
def psychologist():
print ‘Please tell me your problems‘
while True:
answer = (yield)
if answer is not None:
if answer.endswith(‘?‘):
print (“Don‘t ask yourself too much questions”)
elif ‘good‘ in answer:
print “A that‘s good, go on”
elif ‘bad‘ in answer:
print “Don‘t be so negative”
free = psychologist()
print free.next()
print free.send(‘I feel bad‘)
print free.send(“Why I shouldn‘t ?”)
print free.send(“ok then i should find what is good for me”)
--------------------
结果:
代码如下:
Please tell me your problems
None
Don‘t be so negative
None
Don‘t ask yourself too much questions
None
A that‘s good, go on
None
篇5:python实现的系统log类实例
作者:liujian0616 字体:[增加 减小] 类型:
这篇文章主要介绍了python实现的系统实用log类,实例分析了Python基于logging模块实现日志类的相关技巧,需要的朋友可以参考下
本文实例讲述了python实现的系统实用log类,分享给大家供大家参考。具体如下:
每个系统都必不可少会需要一个log类,方便了解系统的运行状况和排错,python本身已经提供了一个logger了,很强大,只要稍微封装一下就可以放到自己的系统了,下面是我自己的log类
文件名:logger.py
“”“This module takes care of the logginglogger helps in creating a logging system for the application Logging is initialised by function LoggerInit.”“”import loggingimport osimport sysclass logger(object): “”“Class provides methods to perform. logging.”“” m_logger = None def __init__(self, opts, logfile): “”“Set the default logging path.”“” self.opts = opts self.myname = ‘dxscs‘ self.logdir = ‘.‘ self.logfile = logfile self.filename = os.path.join(self.logdir, self.logfile) def loginit(self): “”“Calls function LoggerInit to start initialising the logging system.”“” logdir = os.path.normpath(os.path.expanduser(self.logdir)) self.logfilename = os.path.normpath(os.path.expanduser(self.filename)) if not os.path.isdir(logdir):try: os.mkdir(logdir)except OSError, e: msg = (‘(%s)‘%e) print msg sys.exit(1) self.logger_init(self.myname) def logger_init(self, loggername): “”“Initialise the logging system. This includes logging to console and a file. By default, console prints messages of level WARN and above and file prints level INFO and above. In DEBUG mode (-D command line option) prints messages of level DEBUG and above to both console and file. Args: loggername: String - Name of the application printed along with the log message. ”“” fileformat = ‘[%(asctime)s] %(name)s: [%(filename)s: %(lineno)d]: %(levelname)-8s: %(message)s‘ logger.m_logger = logging.getLogger(loggername) logger.m_logger.setLevel(logging.INFO) self.console = logging.StreamHandler() self.console.setLevel(logging.CRITICAL) consformat = logging.Formatter(fileformat) self.console.setFormatter(consformat) self.filelog = logging.FileHandler(filename=self.logfilename, mode=‘w+‘) self.filelog.setLevel(logging.INFO) self.filelog.setFormatter(consformat) logger.m_logger.addHandler(self.filelog) logger.m_logger.addHandler(self.console) if self.opts[‘debug‘] == True:self.console.setLevel(logging.DEBUG)self.filelog.setLevel(logging.DEBUG)logger.m_logger.setLevel(logging.DEBUG) if not self.opts[‘nofork‘]:self.console.setLevel(logging.WARN) def logstop(self): “”“Shutdown logging process.”“” logging.shutdown()#test if __name__ == ‘__main__‘: #debug mode & not in daemon pts = {‘debug‘:True,‘nofork‘:True} log = logger(opts, ‘dxscs_source.log‘) log.loginit() log.m_logger.info(‘hello,world‘)
执行结果:
终端和文件中都显示有:[-09-06 16:56:01,498] dxscs: [logger.py: 88]: INFO : hello,world
如果只需要显示在文件中可以将debug和nofork选项都置为false
希望本文所述对大家的Python程序设计有所帮助,
篇6:Python中name的使用实例
这篇文章主要介绍了Python中__name__的使用实例,并总结了两种情况下__name__的值会是什么,需要的朋友可以参考下
1. 如果模块是被导入,__name__的值为模块名字
2. 如果模块是被直接执行,__name__的值为‘__main__‘
Py1.py
代码如下:
#!/usr/bin/env python
def test():
print ‘__name__ = ‘,__name__
if __name__ == ‘__main__‘:
test()
Py2.py
代码如下:
#!/usr/bin/env python
import Py1.py
def test():
print ‘__name__ = ‘,__name__
if __name__ == ‘__main__‘:
test()
print ‘Py1.py __name__ = ‘,Py1.__name__
执行结果:
代码如下:
__name__=__main__
Py1.py __name__=Py1
通过结果可以知道,Py2.py直接执行,那么内建变量__name__的值为__main__,否则为模块的名字,通过这个特性可以在if语句里面添加测试代码,可以提高减少BUG,提高程序的健壮性,
Python中name的使用实例
,
代码如下:
if __name__ == ‘__main__‘:
test()
★Shell脚本中使用for循环和cat命令实现按顺序合并文件
★python实现分析apache和nginx日志文件并输出访客ip列表的方法
★Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上
文档为doc格式