python语法笔记(四)

1、对象的属性 
    python一切皆对象,每个对象都可能有多个属性。python的属性有一套统一的管理方案。 
属性的__dict__系统 
    对象的属性可能来自于其类定义,叫做类属性;还可能是该对象实例自身定义的属性,叫做对象属性。类属性可能来自类定义自身,也可能根据定义继承而来。 
    对象的属性存储在对象的__dict__属性中,__dict__是一个词典,键为属性名,值为属性本身。例如:

class Bird(object):feather = Trueclass Chicken(Bird):fly = Falsedef __init__(self, age):self.age = agesummer = chicken(2)
print Bird.__dict__
print Chicken.__dict__
print summer.__dict__{'__dict__': <attribute '__dict__' of 'Bird' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Bird' objects>, 'feather': True, '__doc__': None}{'fly': False, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x2b91db476d70>}{'age': 2}

    可以看出,对类或对象(实际类也是一类对象)调用__dict__方法,只是返回该类或对象新增的属性。如果只有一个对象,而不知道它的类以及其他信息的时候,可以利用__class__属性找到对象的类,然后调用类的__base__属性来查询父类。 
    可以通过__dict__来获取和设置对象的属性。

summer.__dict__['age'] = 3
print(summer.__dict__['age'])summer.age = 5
print(summer.age)

使用特殊方法__getattr__ 
    可以使用 __getattr__(self, name) 来查询即时生成的属性,当我们查询一个属性的时候,如果通过__dict__方法无法找到该属性,那么python会调用该对象的__getattr__方法

class bird(object):feather = Trueclass chicken(bird):fly = Falsedef __init__(self, age):self.age = agedef __getattr__(self, name):if name == 'adult':if self.age > 1.0: return Trueelse: return Falseelse: raise AttributeError(name)summer = chicken(2)
print(summer.adult)
summer.age = 0.5    #本身有age属性
print(summer.adult) #本省没有age属性,会调用__getattr__方法
print(summer.male) #本省没有age属性,会调用__getattr__方法,抛出异常每个特性需要有自己的处理函数,而__getattr__可以将所有的即时生成属性放在同一个函数中处理。__getattr__可以根据函数名区别处理不同的属性。
比如上面我们查询属性名male的时候,raise AttributeError。

 

python中还有一个__getattribute__特殊方法,用于查询任意属性,而__getattr__只能用来查询不在__dict__系统中的属性。

2、闭包 
函数对象作用域 
    python中函数也是对象,函数对象也有其存活的范围,就是函数对象的作用域。函数对象用def语句定义,函数对象的作用域与def所在的层级相同。比如,在函数A中定义内部函数B,内部函数B只能在定义该函数A内部使用,不能在函数A外部使用。

def line_conf():def line(x):return 2*x+1print(line(5))   # within the scopeline_conf()
print(line(5))       # out of the scope

如果使用lambda定义函数,那么函数对象的作用域与lambda所在的层级相同。

闭包 
    函数是一个对象,所以可以作为某个函数的返回结果。

def line_conf():b = 15def line(x):return 2*x+breturn line       # return a function objectb = 5
my_line = line_conf()
print(my_line(5))       

 

line定义的隶属程序块中引用了高层级的变量b,但b信息存在于line的定义之外,成b为line的环境变量。line作为line_conf的返回值时,line中已经包含了b的取值(尽管b并不隶属于line). 
    一个函数和它的环境变量合在一起就构成了一个闭包。在python中,闭包就是一个包含有环境变量取值的函数对象,环境变量取值被保存在函数对象的__closure__属性中。比如:

def line_conf():b = 15def line(x):return 2*x+breturn line       # return a function objectb = 5
my_line = line_conf()
print(my_line.__closure__)
print(my_line.__closure__[0].cell_contents)

 

__closure__里包含了一个元组,该元组中的每个元素都是cell类型的对象。

def line_conf(a, b):def line(x):return ax + breturn lineline1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5), line2(5))
只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,
闭包也具有提高代码可复用性的作用。

 

3、装饰器 
    装饰器是一种高级的python语法,装饰器可以对一个函数、方法或者类进行加工。 
(1)装饰函数和方法 
    装饰器经常用于对一些函数添加这些函数需要共同执行的一些操作。

#定义装饰器函数,装饰器名任意
def decorator(F):def new_F(a, b):print("input", a, b)return F(a, b)return new_F #返回一个可调用对象,该可调用对象以函数为参数# get square sum
@decorator   #使用装饰器进行装饰,在前面使用 @装饰器名
def square_sum(a, b):return a**2 + b**2# get square diff
@decorator
def square_diff(a, b):return a**2 - b**2print(square_sum(3, 4))
print(square_diff(3, 4))
#使用装饰器的效果等同于,将函数重定义
square_sum = decorator(square_sum)
square_sum(3, 4)

 

(2)含参的装饰器 
    装饰器允许我们在调用装饰器的时候提供其他参数,比如 @decorator(params..)

#a new wrapper layer
def pre_str(pre=''):#old decoratordef decorator(F):def newF(a, b):print (pre + 'intput', a, b)return F(a,b)return newFreturn decorator@pre_str('xxxfjdflsd') #提供装饰器参数
def square_num(a, b):return a**2 + b**2

 

(3)装饰类 
    一个装饰器可以接收一个类,并返回一个类,达到加工类的效果。

def decorator(aClass):class newClass(object):def __init__(self, age):self.total_display = 0self.wrapped = aClass(age)def display(self):self.total_display += 1print('total display', self.total_display)self.wrapped.display()return newClass@decorator
class Bird(object):def __init__(self, age):self.age = agedef display(self):print('my age is', self.age)eagleLord = Bird(5)for i in range(3):eagleLord.dislay()

 

参考:

http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么闹钟设置了却不响_又被iPhone闹钟坑了?解决闹钟不响问题看这里!

原标题&#xff1a;又被iPhone闹钟坑了&#xff1f;解决闹钟不响问题看这里&#xff01;你有没有过这样的体验&#xff0c;早上醒来&#xff0c;闹钟还没响&#xff0c;内心想&#xff1a;真好&#xff0c;还可以再睡会。拿起手机想看看还能再睡多久&#xff0c;结果……我的天…

CSS3实现纸张边角卷起效果

html代码 1 <body>2 <div class"page">3 <div class"page-box">4 <h1>5 兔子先生6 </h1>7 <p>8 这几…

fzu 1894 单调队列

http://acm.fzu.edu.cn/problem.php?pid1894 Problem 1894 志愿者选拔Accept: 1328 Submit: 4200Time Limit: 1500 mSec Memory Limit : 32768 KB Problem Description 世博会马上就要开幕了&#xff0c;福州大学组织了一次志愿者选拔活动。参加志愿者选拔的同学们排队接…

均线带角度的指标_选股指标:均线角度并列向上,量能倍增飞扬趋势明显,短线操作可考虑...

今天要讲的是量能飞扬的选股指标&#xff0c;这个指标是按照20日、30日、60日、120日均线反正切角度原理为基础设计的公式&#xff0c;这4条均线角度排列向上&#xff0c;股价呈现向上的趋势&#xff0c;选出的股票有大概率上涨的空间&#xff0c;完整的公式如下&#xff1a;A2…

将链表中m-n范围内的数进行倒序

Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m 2 and n 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the following condition:1 ≤ m ≤ n ≤ lengt…

python 核心编程第5章(习题)

1.标准类型运算符. 写一段脚本&#xff0c;输入一个测验成绩&#xff0c;根据下面的标准&#xff0c;输出他的评分成绩&#xff08;A-F&#xff09;。 #coding:utf8 a raw_input() a int(a) if (a > 100) or (a < 0):print "输入错误,请输入0&#xff5e;100的数字…

cacti pdo_mysql_搭建配置cacti,采集信息监控

安装cactilamp环境[iyunvCacti ~]#service iptables stop //关闭防火墙服务[iyunvCacti ~]#chkconfig iptables off //永久性关闭[iyunvCacti ~]#vi /etc/sysconfig/selinux //把SELINUXenforcing改为SELINUXdisabled1&#xff1a;操作系统的安装&#xff0c;这个就不用写教程了…

win10下安装ubuntu14.04双系统(UEFI固件)

2019独角兽企业重金招聘Python工程师标准>>> 在windows10环境下安装双系统&#xff0c;遇到了很多坑。作为一个用惯了虚拟机的人&#xff0c;本想通过安装双系统来充分利用计算机本身的硬件资源&#xff0c;结果失败了n次&#xff0c;摸索了整整一天&#xff0c;看了…

时区缩写

新西兰标准时间 NZT 12:00 新西兰时间 AESST 11:00 澳大利亚东部夏时制 CST(ACSST) 10:30 中澳大利亚标准时间 CADT 10:30 中澳大利亚夏时制 SADT 10:30 南澳大利亚夏时制 EST(EAST) 10:00 东澳大利亚标准时间 GST 10:00 关岛标准时间 LIGT 10:00 澳大…

【python】内存相关

1. /proc/pid/status 可以查看进程相关的详细信息&#xff0c;当内存异常时可查看 参考&#xff1a;http://blog.csdn.net/beckdon/article/details/48491909 2. top -p 进程号 实时查看进程相关内存 3. 内存调试 参考&#xff1a;http://blog.csdn.net/ybdesire/article/det…

Java反射xml数据类

我们做自己的自动化测试。遇到使用xml存储数据&#xff0c;然而&#xff0c;这些数据可以被封装成一个类。将数据传递。通过下面的实际例子&#xff0c;展示给大家。请欣赏。 第一步&#xff1a;xml数据存储将被使用 第二步&#xff1a;读取xml文件的方法 第三步&#xff1a;xm…

扫雷游戏制作学习过程

1. 扫雷游戏的构思&#xff1a; 设计为初级&#xff0c;中级&#xff0c;高级三个级别。 因此不妨设置为如下规格&#xff1a; 9x9 16x15和30x16 &#xff08;行&#xff0c;列&#xff09;规格不同地雷的数量也不同&#xff0c;分别为 10&#xff0c;40 &#xff0c;99 2.在…

jsp+mysql学生成绩管理系统_jsp+servlet+mysql学生成绩管理系统 javaweb成绩管理系统 - 下载 - 搜珍网...

压缩包 : c59896403d8d913d853f6c0910dc71.zip 列表jsp servlet mysql实现的学生成绩管理系统/jsp servlet mysql实现的学生成绩管理系统/2.txtjsp servlet mysql实现的学生成绩管理系统/jsp servlet mysql实现的学生成绩管理系统.docjsp servlet mysql实现的学生成绩管理系统/…

3.CM3内核架构-寄存器

一、寄存器的种类 转载于:https://www.cnblogs.com/nyqm/p/7954762.html

Oil Deposit

题目描述&#xff1a;The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. I…

Javascript错误处理与调试

错误处理 1 try-catch语句 ECMA-262第3版引入了try-catch语句&#xff0c;作为Javascript中处理异常的一种标准方式&#xff0c;基本的语句如下: try{// 可能发生错误的代码}chatch(error){// 在错误发生时怎么处理} 如果try块中的任何代码发生了错误&#xff0c;就会立即退出代…

mysql 6.5.7_centos 6.5装mysql5.7

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼报错er-5.7.17-1.el7.i686 需要--> 处理依赖关系 libc.so.6(GLIBC_2.17)&#xff0c;它被软件包 mysql-community-server-5.7.17-1.el7.i686 需要--> 完成依赖关系计算错误&#xff1a;Package: mysql-community-client-5.7.…

201621123080《Java程序设计》第十一周学习总结

201621123080《Java程序设计》第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结多线程相关内容。 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读&#xff1a;多线程程序BounceThread 1.1 BallRunnable类有什么用&#…

Unix/Linux环境C编程入门教程(27) 内存那些事儿

calloc() free() getpagesize() malloc() mmap() munmap()函数介绍calloc&#xff08;配置内存空间&#xff09; 相关函数 malloc&#xff0c;free&#xff0c;realloc&#xff0c;brk表头文件 #include <stdlib.h>定义函数 void *calloc(size_t nmemb&#xff0c;size_t…

Fix an “Unapproved Caller” SecurityAgent Message in Mac OS X

上午一进公司就被日本分公司的美女呼叫&#xff0c;说mac硬盘加密经常开机后需要输入硬盘加密密码才可以登录&#xff0c;我想应该是硬盘加密后没有给用户添加许可证&#xff0c;所以每次登录系统都要进行验证。于是远程到用户电脑上后&#xff0c;准备在硬盘加密的设置里添加用…