python基础整理笔记(八)
一. python反射的方式来调用方法属性
反射主要指的就是hasattr、getattr、setattr、delattr这四个函数,作用分别是检查是否含有某成员、获取成员、设置成员、删除成员。
此外还有一个 __import__方法,用来与getattr可以实现一些根据字符串来动态的获取模块、方法、属性的方法,示例如下:
# 普通的import模块方法:
import AA as aa # 使用__import__的等效方法:
aa = __import__('AA') # 再通过getattr,可以获取到 aa模块里定义的 aaClass
aaClass = getattr(aa, 'aaClass')
# 这样可以正常的实例化
aaObj = aaClass ('abc') # 再通过getattr可以把示例里面的方法也用出来,属性也取出来
func = getattr(aaObj , 'aaFuncton')
func()
print(getattr(aaClass, 'aaAttr'))
二. python类的一些注意点
1. 定义在子类里的属性和方法(注意不是子类重写的,而是特有的,父类没有的),在父类的方法里面我们也可以调用!但是如果是父类的实例,去调用了使用了这种子类属性的方法,是会报错的!这种实现的作用,是将父类当做类似其他语言中的纯抽象类或者接口的实现,父类里是不会调用这样的方法的,或者实例化父类的。使用这种方式,可以降低代码的重复,将更多的共同抽象到父类里面去。
示例如下:
class Father(object):
def __init__(self):
self.aa = 1
self.bb = 2 def show_bb(self):
print self.bb def show_cc(self):
print self.cc class Son(Father):
def __init__(self):
super(Son, self).__init__()
self.cc = 3 s1 = Son()
s1.show_bb()
s1.show_cc()

如图所示,这里调用 show_bb()和show_cc()都是合法的,尽管show_cc()是父类的方法,而且父类没定义cc这个属性。这是因为这里的self是子类自己的s1这个实例。
但是如果要实例化父类并调用show_cc就会出错如下:

2. python中类有个特殊的方法 __call__,它的作用是实现了这个方法,那么在调用实例的后面直接加一个(),就会执行这个__call__方法。
示例如下:
class Father(object):
def __init__(self):
self.aa = 1
self.bb = 2 def show_bb(self):
print self.bb def show_cc(self):
print self.cc class Son(Father):
def __init__(self):
super(Son, self).__init__()
self.cc = 3 def __call__(self, *args, **kwargs):
self.show_bb()
self.show_cc() s1 = Son()
s1()

用这种方法,能够在一些情况下让代码显得更加简洁清晰。
3. python中的类,还有个特殊方法__iter__,实现了这个方法,就可以直接对这个类的实例进行迭代,示例如下:
class TestIter(object):
def __init__(self):
self.iter_lst = [1, 3, 4, 5] def __iter__(self):
for i in self.iter_lst:
yield i t1 = TestIter() for i in t1:
print i

4. property, XXX.setter装饰器
在python的类中,还有两个特殊的装饰器,一个叫property,一个叫XXX.setter,
前者作用是能像调用属性一样的调用一个方法,后者作用是能像给属性设值一样调用一个方法...XXX是这个方法的名称。通过这两个装饰器,一个类里面就可以有两个同名的方法,分别负责存取一个像属性的值。
示例如下:
class TestPP(object):
def __init__(self):
self.aa = 1
self.bb = 2 @property
def aa_bb(self):
return self.load_aa_bb() @aa_bb.setter
def aa_bb(self, new_value):
self.save_aa_bb(new_value) @staticmethod
def save_aa_bb(aa_bb):
with open('aa_bb', 'wb') as fp:
fp.write(aa_bb) def load_aa_bb(self):
if os.path.exists('aa_bb'):
with open('aa_bb', 'rb') as fp:
return fp.read()
else:
init_value = '%s_%s' % (self.aa, self.bb)
self.save_aa_bb(init_value)
return init_value pp = TestPP()
print(pp.aa_bb)
pp.aa_bb = ''
print(pp.aa_bb)

这种方式往往用于对一个外部存储的属性(比如存在数据库,json文件中等),进行获取和赋值时候使用,可以使得代码变得简洁。
python基础整理笔记(八)的更多相关文章
- python基础整理笔记(九)
一. socket过程中注意的点 1. 黏包问题 所谓的黏包就是指,在TCP传输中,因为发送出来的信息,在接受者都是从系统的缓冲区里拿到的,如果多条消息积压在一起没有被读取,则后面读取时可能无法分辨消 ...
- python基础整理笔记(五)
一. python中正则表达式的一些查漏补缺 1. 给括号里分组的表达式加上别名:以便之后通过groupdict方法来方便地获取. 2. 将之前取名为"name"的分组所获得的 ...
- python基础整理笔记(四)
一. python 打开文件的方法 1. python中使用open函数打开文件,需要设定的参数包括文件的路径和打开的模式.示例如下: f = open('a.txt', 'r+') 2. f为打开文 ...
- python基础整理笔记(一)
一. 编码 1. 在python2里,加载py文件会对字符进行编码,需要在文件头上的注释里注明编码类型(不加则默认是ascII). # -*- coding: utf-8 -*- print 'hel ...
- python基础整理笔记(七)
一. python的类属性与实例属性的注意点 class TestAtt(): aaa = 10 def main(): # case 1 obj1 = TestAtt() obj2 = TestAt ...
- python基础整理笔记(三)
一. python的几种入参形式:1.普通参数: 普通参数就是最一般的参数传递形式.函数定义处会定义需要的形参,然后函数调用处,需要与形参一一对应地传入实参. 示例: def f(a, b): pri ...
- python基础整理笔记(二)
一. 列表 1. 创建实例: a = [1,2,3] b = list() 2. 主要支持的操作及其时间复杂度如下: 3. 其他 python中的列表,在内存中实际存储的形式其实是分散的存储,比较类似 ...
- python基础整理笔记(六)
一. 关于hashlib模块的一些注意点 hashlib模块用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512, MD ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
随机推荐
- 循序渐进Python3(八) -- 1 -- socket进阶
IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Linux中的 select,poll,epoll 都 ...
- 浅析jquery ui的datepicker组件
今天计划在博客上添加一个日历,方便用户查看日期.Google了一圈,最终决定使用jquery ui的datepicker部件实现.原因有三:Datepicker使用配置比较简洁,几行代码就可以得到一个 ...
- crontab 系列
crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 servi ...
- SwipeRefreshLayout嵌套ScrollView包裹复杂头布局和RecyclerView
布局如下:上面是一个描述有:头像和部分信息的布局,底部是一个RecyclerView: 想法:想实现RecyclerView向上滚动的时候,隐藏上面的头像布局信息:使用了 CoordinatorLay ...
- exception 'DOMException' with message 'Invalid Character Error' Php + Mongodb
问题描述: 项目属于MVC设计模式,技术和框架采用了php5.6 + Yii2.0 + MongoDB. 在我从Controller中调用Model 的 findAll([]) 方法获取数据打印到屏幕 ...
- Content is not allowed in prolog ---UTF-8 无bom
- div显示提示信息
div显示提示信息 <body> <style type="text/css"> a.link{position:relative;} a.link div ...
- cell选中后进入重用池出来选中状态消失
#import "XXViewController.h" @interface XXViewController ()<UITableViewDelegate,UITable ...
- TCP、UDP协议间的区别(转)
一.TCP/IP协议是一个协议簇.里面包括很多协议的.UDP只是其中的一个.之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了. TCP/IP协议集包括应用层,传输层 ...
- 用grunt进行前端工程化之路
我们的项目wecash4.0的前端构建考虑过用fis和grunt. 目录: 前期调研:fis vs grunt vs gulp? 一.安装grunt和项目. fis是百度fex研发的构建工具,非常方便 ...