面向对象【day08】:反射(五)
本节内容
- 概述
- 反射函数
- 综合使用
一、概述
反射我们以后会经常用到,这个东西实现了动态的装配,通过字符串来反射类中的属性和方法
二、反射函数
2.1 hasarttr(obj,name_str)
作用:判断一个对象obj中是否有对应的name_str字符串的属性或者方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() print ( hasattr (d,choice)) #obj中是否有对应的choice字符串的属性或者方法 #输出 >>>:name #输入对象存在属性 True >>>:eat #输入对象存在的方法 True |
2.2 getattr(obj,name_str)
作用:根据字符串name_str获取obj对象中的对应方法的内存地址或者对应属性的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() print ( getattr (d,choice)) #choice获取obj对象中的对应方法的内存地址或者对应属性的值 #输出 >>>:name #返回name属性的值 shabi >>>:eat <bound method Dog.eat of <__main__.Dog object at 0x00000157A129CF28 >> #返回eat方法的内存地址 |
2.3 setattr(x,y,z)
作用:给obj对象添加一个新属性或者新方法,setattr(x, 'y', v) is equivalent to ``x.y = v''
①给对象新增一个新方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
def bulk( self ): #先定义一个bulk函数 print ( "{0} is yelling..." . format ( self .name)) class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() setattr (d,choice,bulk) #输入的是talk,所以又等同于d.talk = bulk #d.talk(d) 直接写死,用d.talk(d),一般不这么写 func = getattr (d,choice) #用getattr来获取 func(d) #输出 >>>:talk shabi is yelling... |
②给对象新增一个属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() setattr (d,choice, 22 ) #输入的是age,所以又等同于d.age = 22 # print(d.age) 这样就写死了,还是用下面一种 print ( getattr (d,choice)) #输出 >>>:age 22 |
2.4 delattr(x,y)
作用:删除obj对象中的属性或者方法,delattr(x, 'y') is equivalent to ``del x.y''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() delattr (d,choice) #根据字符串删除属性或者方法 print (d.name) print (d.eat) #输出 >>>:name #删除属性name Traceback (most recent call last): File "E:/PycharmProjects/pythontest/day7/反射/反射.py" , line 22 , in <module> print (d.name) AttributeError: 'Dog' object has no attribute 'name' >>>:eat #删除方法eat Traceback (most recent call last): File "E:/PycharmProjects/pythontest/day7/反射/反射.py" , line 21 , in <module> delattr (d,choice) AttributeError: eat |
三、综合使用
3.1 综合使用hasattr、getattr、setattr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() if hasattr (d,choice): #判断d对象中存在属性和方法 name_value = getattr (d,choice) #获取属性值 print (name_value) setattr (d,choice, "hong" ) #修改属性值 print ( getattr (d,choice)) #重新获取属性的值 else : setattr (d,choice, None ) #设置不存在的属性值为None v = getattr (d,choice) print (v) #输出 >>>:name shabi hong >>>:abc None |
面向对象【day08】:反射(五)的更多相关文章
- Python 面向对象之反射
Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...
- Python之面向对象进阶------反射(Day26)
一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Cla ...
- python 面向对象之反射及内置方法
面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...
- 百万年薪python之路 -- 面向对象之 反射,双下方法
面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...
- SOLID:面向对象设计的五个基本原则
在程序设计领域,SOLID 是由罗伯特·C·马丁在 21 世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则.当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软 ...
- Python面向对象之-反射
Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr 判断是否有改属性或者方法,有返回True,没有返回false getattr 如果是属性获得该属性 ...
- 面向对象之反射 与__str__等内置函数
一 反射 1.面向对象中的反射:通过字符串的形式操作对象的相关属性,python中一切事物都是属性(都可以使用反射) 四个可以实现自省<反射>的函数:hasattr / getattr ...
- day28 面向对象:反射,内置函数,类的内置方法
面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...
- python基础之 面向对象之反射
1.isinstance和issubclass issubclass(Son,Foo) 判断雷与类之间的是否有继承关系,接受两个参数,一个是疑似子类,一个是疑似父类,判断Son是否是Foo的子类 ob ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
随机推荐
- Python学习笔记 ---第三章
函数 函数是代码的一种抽象 函数 说明 abs 绝对值 max 最大值 hex 转换为16进制 强制数据类型转换 int('123') 123 int(12.35) 12 srt(100) '100' ...
- 基于Spring3 MVC实现基于form表单文件上传
http://blog.csdn.net/jia20003/article/details/8474374/
- 腾讯 xtestserver 基本使用教程~
刚刚简单录制了下 腾讯demo的基本测试脚本 成功~get新技能成功~开心ing~ 体验就是: 1.各种安卓机找开发者中心选项的usb调试模式太难找了.. 2.不管录制还是播放录制时都感觉好慢... ...
- Delphi处理Http请求自定义Header
在HTTP请求中,get方法是默认的,但在URL地址长度是有限的,请求方法能传送的数据也是有限的,一般get方法传递的数据不能大于2KB,当get请求方法传递的数据长度不能满足需求时,就需要采用另一种 ...
- 关于js中this指向的理解总结!
关于js中this指向的理解! this是什么?定义:this是包含它的函数作为方法被调用时所属的对象. 首先,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁 ...
- SQLSERVER安装
sql server 2008 代理服务提供的凭据无效 sql server 2008 代理服务提供的凭据无效 在Windows Server 2008安装SQL Server 2008出现的问题: ...
- oracle小知识点
一 . procedure和function: procedure和function在语法上几乎完全一样,使用上却有小小的差别, procedure可以单独的调用 在命令行直接exec pro_xxx ...
- JavaScript——AJAX
AJAX技术是网页构建的必备技能之一,本文希望能帮助大家轻松的学习这项技术 一.什么是ajax? ajax(异步javascript xml) 能够刷新局部网页数据而不是重新加载整个网页. 二.如何使 ...
- mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条
mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条
- Layui_1.0.9_分页实例_Java
一.实体 package com.ebd.application.modules.taskManage.pojo; import com.ebd.application.common.Base.Bas ...