反射

什么是反射?

  通过字符串的形式操作对象相关属性。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. UOJ228:基础数据结构练习题——题解

    http://uoj.ac/problem/228 参考:https://www.cnblogs.com/ljh2000-jump/p/6357583.html 考虑当整个区间的最大值开方==最小值开 ...

  2. Communications link failure

    针对数据库Communications link failure的错误,可以理解为有两种策略解决: 策略1(推荐):     数据池配置 <property name="minEvic ...

  3. css命名冲突解决方法

    css的命名冲突目前有几种解决方法: 1.命名约定 人为的制定一下命名规则以避免冲突,例如前缀,嵌套等 2.CSS in JS 在JavaScript中写CSS,使用工具编译为css,最常见的是sty ...

  4. 总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)

    犀利的开头 在机器学习中,我们用训练数据集去训练(学习)一个model(模型),通常的做法是定义一个Loss function(误差函数),通过将这个Loss(或者叫error)的最小化过程,来提高模 ...

  5. Machine Learning CodeForces - 940F (带修改的莫队)

    You come home and fell some unpleasant smell. Where is it coming from? You are given an array a. You ...

  6. 题解【luogu4145 上帝造题的七分钟2(花神游历各国)】

    题目大意: 一个序列,支持区间开方与求和操作. 算法:线段树实现开方修改与区间求和 分析: 显然,这道题的求和操作可以用线段树来维护 但是如何来实现区间开方呢 大家有没有这样的经历:玩计算器的时候,把 ...

  7. Leetcode 703. 数据流中的第K大元素

    1.题目要求 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器, ...

  8. SqlServer中循环和条件语句示例!

    -- ╔════════╗ -- =============================== ║ if语句使用示例 ║ -- ╚════════╝ declare @a int set @a=12 ...

  9. 关于$.data(element,key,value)与ele.data.(key,value)的区别

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Linux局域网内文件传送

    先安装ssh服务 sudo apt-get install ssh 普通传输文件,可以使用scp命令 1.将本地文件复制到目标机器: scp  文件名 用户名@目标机器IP:目标机器路径 回车后输入密 ...