反射

什么是反射?

  通过字符串的形式操作对象相关属性。python中的事物都是对象;

关键方法:

  (1)getattr:获取属性

  (2)setattr:设置属性

  (3)hashattr:检测是否含有属性,返回布尔值

  (4)delattr:删除属性

具体功能演示:

class Foo:
        f = '类对静态变量'
        def __init__(self, name, age):
                self.name = name
                self.age = age         def say_hi(self):
                print('hi, %s' % self.name) obj = Foo('xiaofei', 20) # 检测是否含有某属性
print(hasattr(obj, 'name'))
print(hasattr(obj, 'say_hi'))
# 执行结果:
# True
# True print('--------------------------------------') # 获取属性:
print(getattr(obj, 'name'))
func = getattr(obj, 'say_hi')
func()
print(getattr(obj, 'aaaaa', '不存在!')) # 执行结果:
# xiaofei
# hi, xiaofei
# 不存在! print('--------------------------------------') # 设置属性 setattr(obj, 'gender', 'female')
setattr(obj, 'show_name', lambda self: self.name + 'er')
print(obj.gender)
print(obj.show_name(obj)) # 执行结果:
# female
# xiaofeier print('--------------------------------------') # 删除属性
delattr(obj, 'age')
delattr(obj, 'show_name')
print(obj.__dict__)
# 执行结果:
# {'gender': 'female', 'name': 'xiaofei'} delattr(obj, 'aaaa') # 删除不存在对属性,会报错 实例中的用法: import os
class Manage_cmd(object):
        def run(self):
                while True:
                        cmd = input('>>>').strip()
                        if not cmd: continue
                        if hasattr(self, cmd):
                                func = getattr(self, cmd)
                                func()
                        else:
                                print('-bash: %s: command not found' % cmd)         def ls(self):
                print(os.listdir('.')) cmd = Manage_cmd()
cmd.run() # 执行结果:
# >>>ls
# ['test1.py']
# >>>asdfadf
# -bash: asdfadf: command not found

反射功能演示代码

1. 反射不仅仅只能用在属性上,也可以用在方法上

class Foo(object):
        staticField = 'hello world.'         def __init__(self):
                self.name = 'hkey'         def test(self):
                return 'test'         @staticmethod
        def bar():
                return 'bar' print(getattr(Foo, 'staticField'))
print(getattr(Foo, 'test'))
func = getattr(Foo, 'bar')
print(func()) # 执行结果:
# hello world.
# <function Foo.test at 0x00000141FE18D158>
# bar

反射类的方法

2. 反射当前文件(模块)成员

import sys

def s1():
        print('s1') def s2():
        print('s2') this_module = sys.modules[__name__]
print(hasattr(this_module, 's1'))
func = getattr(this_module, 's2')
func() # 执行结果:
# True
# s2

反射当前py文件的函数

3. 导入其他模块,利用反射查找该模块是否存在某个方法

module_test.py

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey def test():
        print('form the test.') test1.py '''
程序目录:
module_test.py
test1.py 当前文件:
test1.py
''' import module_test as obj if hasattr(obj, 'test'):
        func = getattr(obj, 'test')
        func() # 执行结果:
# form the test.

利用反射导入另一个文件的函数及方法

item 系列

关键方法:

__getitem__:如果在类中定义了__getitem__()方法,那么就可以通过dict的形式,P[key]取值,当实例对象作P[key]运算时,就会调用类中的__getitem__()方法;

class Student(object):
        def __init__(self, name):
                self.name = name         def __getitem__(self, item):
                print(self.__dict__[item]) s = Student('hkey')
s.age = 20
s['name']
s['age']
# 执行结果:
# hkey
#

__getitem__演示代码

__setitem__:如果在类中定义了__setitem__()方法,那么就可以通过dict的形式添加属性和方法;

class Student(object):
        def __init__(self, name):
                self.name = name         def __setitem__(self, key, value):
                self.__dict__[key] = value         def __getitem__(self, item):
                print(self.__dict__[item]) s = Student('hkey')
# 调用类的__setitem__方法,通过dict的形式进行添加对象的属性
s['age'] = 20
s['hobby'] = 'coding' # 调用类的__getitem__方法,通过dict的形式获取对象的属性
s['age']
s['hobby'] # 执行结果:
#

__setitem__演示代码

__delitem__:通过dict的形式,删除对象的属性或方法

class Student(object):
        def __init__(self, name):
                self.name = name         def __getitem__(self, item):
                return self.__dict__[item]         def __delitem__(self, key):
                self.__dict__.pop(key)
                print('执行我了。') s = Student('hkey')
s.age = 20
print(s['name'])
print(s['age'])
del s['age'] # 执行结果:
# hkey
#
# 执行我了。

__delitem__演示代码

[ python ] 反射及item系列的更多相关文章

  1. 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__

    反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...

  2. day7--面向对象进阶(内含反射和item系列)

    一面向对象的结构和成员 1.1面向对象的结构 class A: company_name = '老男孩教育' # 静态变量(静态字段) __iphone = '1353333xxxx' # 私有静态变 ...

  3. python面向对象( item系列,__enter__ 和__exit__,__call__方法,元类)

    python面向对象进阶(下)   item系列 __slots__方法 __next__ 和 __iter__实现迭代器  析构函数 上下文管理协议 元类一.item系列 把对象操作属性模拟成字典的 ...

  4. python 全栈开发,Day24(复习,__str__和__repr__,__format__,__call__,__eq__,__del__,__new__,item系列)

    反射: 使用字符串数据类型的变量名来使用变量 wwwh即what,where,why,how  这4点是一种学习方法 反射 :使用字符串数据类型的变量名来使用变量 1.文件中存储的都是字符串 2.网络 ...

  5. Python概念-Item系列(林海峰教的)

    这个Item系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ ...

  6. python 反射和内置方法

    一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) ...

  7. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  8. 1、__del__ 2、item系列 3、__hash__ 4、__eq__

    1.__del__   析构方法       释放一个空间之前之前 垃圾回收机制   2.item系列   和对象使用[ ]访问值有联系 __getitem__ __setitem__ __delit ...

  9. __del__,item系列 ,hash方法,__eq__,

    # 构造方法 申请一个空间# 析构方法 释放一个空间 # 某个对象借用了操作系统的资源,还要通过析构方法归还回去:文件资源 网络资源 # 垃圾回收机制 class A: def __del__(sel ...

随机推荐

  1. POJ2406:Power Strings——题解

    http://poj.org/problem?id=2406 就是给一个串,求其循环节的个数. 稍微想一下就知道,KMP中nxt数组记录了所有可与前面匹配的位置. 那么如果我们的循环节长度为k,有n个 ...

  2. BZOJ1565:[NOI2009]植物大战僵尸——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1565 https://www.luogu.org/problemnew/show/P2805 Pla ...

  3. 洛谷3805:【模板】manacher算法——题解

    https://www.luogu.org/problemnew/show/P3805 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 板子题, ...

  4. 获取指定IP地址对应的物理位置

    # -*- coding: utf-8 -*- import requests def get_physical_location(ip): url = 'http://ip.taobao.com/s ...

  5. CCPC-Winter Camp div2 day5

    DIV2 有部分div1的题会写 div1的大佬真的太强了 向他们学习 (好像和zqc大佬说过话了hhh,zqc大佬真的是一个超有意思的人啊,羡慕有妹子队友的zqc大佬) A: 你有一棵树,你想把它画 ...

  6. HDU1114 背包

    Piggy-Bank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. Android编程之LayoutInflater的inflate方法详解

    LayoutInflater的inflate方法,在fragment的onCreateView方法中经常用到: public View onCreateView(LayoutInflater infl ...

  8. Java设计模式の装饰者模式

    目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮 ...

  9. 梳排序Comb sort

    梳排序还是基于冒泡排序,与冒泡不同的是,梳排序比较的是固定距离处的数的比较和交换,类似希尔那样 这个固定距离是待排数组长度除以1.3得到近似值,下次则以上次得到的近似值再除以1.3,直到距离小至3时, ...

  10. Php扩展--protocolbuffers消息打包

    安装/配置 编译安装 wge thttp://pecl.php.net/get/protocolbuffers-0.2.6.tgz tar -zxvfprotocolbuffers-0.2.6.tgz ...