反射

什么是反射?

  通过字符串的形式操作对象相关属性。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. ARC072E Alice in linear land

    ---题面--- 题解: 首先我们要观察到一个性质,因为在固定的起始距离下,经过固定的操作,最后所在的位置是固定的,我们设经过操作1 ~ i之后所在的地方距离终点为d[i]. 那么如果女巫可以修改第i ...

  2. CF633C:Spy Syndrome 2——题解

    https://vjudge.net/problem/CodeForces-633C http://codeforces.com/problemset/problem/633/C 点击这里看巨佬题解 ...

  3. 爆款PHP面试题

    $a = 3; $b = 6; if ($a = 4 || $b = 4) { $a++; $b++; } echo $a; //输出 1 echo $b; //输出 7 逛鸟哥博客,看评论区有个新手 ...

  4. LibreOJ #6220. sum(数论+构造)

    题目大意:在数组中找出一些数,使它们的和能被n整除 这题标签是数学,那我就标题就写数论好了... 显然如果数组中有n的倍数直接取就行. 那假设数组中没有n的倍数,把数组中的数求前缀和后全部%n,会得到 ...

  5. Django内置auth模块中login_required装饰器用于类视图的优雅方式

    使用多继承 以及类似java中的静态代理模式 原理:OrderView.as_view()根据广度优先,调用的是LoginRequiredMixin中的as_view(cls, *args, **kw ...

  6. switch语法的盲点

    switch语法在项目使用的频率很低,今天看到一个相关的例子引发一些思考,,同时自己也写了一些简单的例子如下: 实例1: int dayOfWeek = 5; switch (dayOfWeek){ ...

  7. redis中如何对 key 进行分类

    因为redis中的 hash是不支持设置过期时间的,如果我们要 设置过期时间,还要分类存储,可以用下面折中的方法 其实就是我们把 key 定义的有规律一些,通过在key的字符串内部 分类,上图只是因为 ...

  8. linux配置虚拟机网络环境(老师要求的host-only)

    我这个人就是懒,这TMD是全天下最坑爹的缺点了,当然爆粗口也是缺点,让我发泄一下吧.T^T 从n久之前,开了hadoop课的一天,我就想着要配置好,结果两次课连眼镜都忘了带,可想而知是什么陪我度过了那 ...

  9. Codeforces Round #343 (Div. 2) A

    A. Far Relative’s Birthday Cake time limit per test 1 second memory limit per test 256 megabytes inp ...

  10. JQuery学习三(隐式迭代和节点遍历)

    在JQuery中根据id获取控件,如果输入id错误是不报错的. 必要时可以通过写判断语句进行判断是否id写错 <!DOCTYPE html> <html xmlns="ht ...