一. 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. kangle 默认支持ETag,如果是用kangle做源不会识别,但是做cdn或反向代理会自动识别

    kangle  默认支持ETag,如果是用kangle做源不会识别,但是做cdn或反向代理会自动识别

  2. swift 之 闭包

    一.闭包 格式:{  (  参数名:类型, 参数名:类型 ..  )   in 内容体  return  返回值   }  最完整的闭包 1.省略参数类型 {  (  参数名, 参数名..  )   ...

  3. csdn的app打开贴子显示空白?

    csdn或者虎扑的app打开贴子显示空白,卸载后重装仍然有同样的问题. 可能是android系统的WebView版本太落后. 打开应用市场,更新WebView就可以解决了.

  4. Xcode中给控件添加颜色时自动显示出颜色

    在iOS开发中,给一些控件设置颜色的时候,设置完不能立马看到颜色.必须要运行程序之后才能看到设置的颜色,如果颜色有偏差再回代码改参数,然后再运行看颜色很是麻烦.令人高兴得是Xcode有很多功能强大插件 ...

  5. typedef 与指针、多维数组

    1.在typedef中使用指针往往会带来意外的结果.如下: typedef string *pstring; const pstring cstr; 绝大数人刚开始都会认为cstr是一种指针,它指向c ...

  6. DNS弹窗广告遭遇

    事情是这样的,不久前,我跟往常一样打开某新闻网页的时候,发现右下角有弹窗广告,并且在原页面任意位置点击,都会打开一个广告页面,然后原页面才能正常点击,手法太低劣了,不像是网站挂的广告,然后打开其它网页 ...

  7. AspJpeg使用 .

    下载ASPJpeg的bll库,引用 一.为图片添加水印//实例化组件ASPJPEGLib.IASPJpeg objJpeg = new ASPJPEGLib.ASPJpeg();//打开源图片文件ob ...

  8. ASP.NET 页生命周期

    ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件处理程序代码以及进行 呈现.了解页生命周期非常重要,因为这样 ...

  9. C++链接两个cpp 文件

    我们在编程中,有没有想过,分别写代码,然后把两个cpp,文件合并,两个自身本不能运行的文件,在一起却可以运行(主要牵扯函数调用,一个有声明和调用,另一个定义).那么具体如何实现呢? 跟着我的步骤: 1 ...

  10. DHCP配置

    DHCP服务器IP:192.168.1.10 一,安装dhcp [root@localhost ~]# yum install dhcp Loaded plugins: product-id, sub ...