面向对象【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面向对象编 ...
随机推荐
- @ModelAttribute注解(SpringMVC)
在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法. 在方法的入参前使用 @Mod ...
- Beta阶段敏捷冲刺一
一.举行站立式会议 1.当天站立式会议照片一张 2.团队成员报告 林楚虹 (1) 昨天已完成的工作:查找连接数据库有关资料,请教在上一轮已经连接成功的同学 (2) 今天计划完成的工作:连接上数据库 ( ...
- back to top 回到顶部按钮 css+js
效果 html <p id="back-to-top"><a href="#top"><span></span> ...
- 【转帖】MYSQL 8.0 忘记密码的简单处理。--init-file
Copy From https://www.cnblogs.com/wangjiming/p/10363357.html mysql 不熟悉 但是感觉语法的确与oracle越来越像了. 感谢原作者 我 ...
- 转帖: Serverless架构模式简介
Serverless架构模式简介 原贴地址:https://blog.csdn.net/chdhust/article/details/71250099?utm_medium=referral&a ...
- Java和Android的Lru缓存,及其实现原理
一.概述 Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存.Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的LRULinkedHas ...
- hive web界面管理
老版本使用 访问<Hive Server Address>:9999/hwi 1.首先下载对应版本的src文件,本机使用apache-hive-1.2.2-src.tar.gz 2.解压缩 ...
- loadrunner基础学习笔记六-运行负载
controller视图: 场景组 窗格:查看场景组内vuser状态,使用窗格右侧的按钮可以启动.停止和重置场景,查看各个vuser的状态,通过手动添加更多vuser增加场景运行期间应用程序的负载 场 ...
- Java之使用HttpClient发送GET请求
package LoadRunner; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import o ...
- python之文件读写和异常处理
# 文件读取.写入和异常处理操作举例 # date:2017-07-17 file_name = "D:/file_demo.txt" with open(file_name, ' ...