一. 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. log4j相对路径找不到,处理方法

    http://blog.csdn.net/u012345283/article/details/40821833?utm_source=tuicool&utm_medium=referral

  2. Texture Filter中的Bilinear、Trilinear以及Anistropic Filtering

    1. 为什么在纹理采样时需要texture filter(纹理过滤)?我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中心和纹理上的texel中心并不一至(pixel不一定对应texture ...

  3. Odoo 中的 Controller

    来自  Odoo处理HTTP请求的接口用的Contoller类,封装于web模块中. --------------------------------------------------------- ...

  4. C# DataGridView控件清空数据完美解决方法

    C# DataGridView控件绑定数据后清空数据在清除DataGridview的数据时: 1.DataSource为NULL(DataGridView.DataSource= null;)这样会将 ...

  5. 如何让textarea不可拖拽

    文本域textarea有一个特性,就是可以拖拽改变其大小,但是在布局严格要求的页面中,这种特性显然会影响布局. 一行代码就可以搞定: textarea{ resize:none;} 但是在chrome ...

  6. z-index和transform

    z-index和transform是CSS中的属性,但很少同学将二者联系到一起,感觉他们八杆子打不上.事实真的是这样吗?如果你也不能确认,这篇文章就值得你花点时间阅读.因为阅读完了,你会有所收获的. ...

  7. tnsnames.ora配置注意(连接新的数据库)

    文件地址D:\app\think\product\11.2.0\instantclient_11_2\network\admin\tnsnames.ora# tnsnames.ora Network ...

  8. 【如何快速的开发一个完整的iOS直播app】(采集篇)

    原文转自:袁峥Seemygo    感谢分享.自我学习 前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,首先需要采集主 ...

  9. AFN 无网络监控

    直接把封装到请求里就好 -(void)afn{ //1.创建网络状态监测管理者 AFNetworkReachabilityManager *manger = [AFNetworkReachabilit ...

  10. EAA脚本语言0.2

    对上一版的改进.IL生成问题大部分解决了. 运行效果 脚本源码 #using "System"; #using "System.Drawing"; #using ...