一. 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基础整理笔记(八)的更多相关文章

  1. python基础整理笔记(九)

    一. socket过程中注意的点 1. 黏包问题 所谓的黏包就是指,在TCP传输中,因为发送出来的信息,在接受者都是从系统的缓冲区里拿到的,如果多条消息积压在一起没有被读取,则后面读取时可能无法分辨消 ...

  2. python基础整理笔记(五)

    一. python中正则表达式的一些查漏补缺 1.  给括号里分组的表达式加上别名:以便之后通过groupdict方法来方便地获取. 2.  将之前取名为"name"的分组所获得的 ...

  3. python基础整理笔记(四)

    一. python 打开文件的方法 1. python中使用open函数打开文件,需要设定的参数包括文件的路径和打开的模式.示例如下: f = open('a.txt', 'r+') 2. f为打开文 ...

  4. python基础整理笔记(一)

    一. 编码 1. 在python2里,加载py文件会对字符进行编码,需要在文件头上的注释里注明编码类型(不加则默认是ascII). # -*- coding: utf-8 -*- print 'hel ...

  5. python基础整理笔记(七)

    一. python的类属性与实例属性的注意点 class TestAtt(): aaa = 10 def main(): # case 1 obj1 = TestAtt() obj2 = TestAt ...

  6. python基础整理笔记(三)

    一. python的几种入参形式:1.普通参数: 普通参数就是最一般的参数传递形式.函数定义处会定义需要的形参,然后函数调用处,需要与形参一一对应地传入实参. 示例: def f(a, b): pri ...

  7. python基础整理笔记(二)

    一. 列表 1. 创建实例: a = [1,2,3] b = list() 2. 主要支持的操作及其时间复杂度如下: 3. 其他 python中的列表,在内存中实际存储的形式其实是分散的存储,比较类似 ...

  8. python基础整理笔记(六)

    一. 关于hashlib模块的一些注意点 hashlib模块用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512, MD ...

  9. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

随机推荐

  1. Git保存密码

    TortoiseGit中,通过https方式连接时,默认是不会保存帐号密码,需要我们每次输入一次,真心很麻烦! 通过简单的设置,就可以解决这一问题! 编辑仓库目录中本地的”.git/config”文件 ...

  2. Samba 共享文件后在Windows 上无法访问的问题

    /etc/samba/smb.conf的配置如下: #============================ Share Definitions ========================== ...

  3. hdu4044 GeoDefense

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4044 题意:一个树上的塔防游戏.给你n个结点的树,你要在树结点上建塔防御,在第 i 个结点上有 ki ...

  4. IE11部分图片无法显示的兼容办法

    问题描述:写的网页在浏览器中测试兼容问题,FF,Chrome,Edge都完美兼容(包括Edge中的仿真),但是在IE11中却无法显示部分图片,并且报:DOM7009: 无法解码 URL 处的图像 错误 ...

  5. vs快捷方式

    项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添加 ...

  6. 自定义shape文件

    1.shape文件 btn_bg.xml文件内容 <?xml version="1.0" encoding="utf-8"?> <shape ...

  7. sqlite的增删改查

    // 基本步骤 // 1. 打开数据库 // 2. 处理数据 // 3. 关闭数据库 //先设置全局变量 lazy var documentsPath: String = { let paths = ...

  8. Java Calendar 注意事项

    Java JDK 提供了java.util.Calendar来处理日期和时间.Calendar是一个抽象类,是所有日历的模板,因此我们可以继承Calendar来实现其他的历法(比如阴历). Java提 ...

  9. JavaScript数组的一些方法集合

    数组方法集合 push()添加到数组末尾,并返回修改后数组的长度 var a=array.push('a','b'); alert(a);//2 pop() 移除数组最后一项,返回移除的项. shif ...

  10. 清除oracle中的缓存(具体细节未知, 慎用)

    oracle中的缓存主要是指SGA中的:1.share pool2.database buffer cache清空命令如下:首先要登录到sqlplus命令下,输入如下命令即可:SQL> alte ...