本节内容

  1. 概述
  2. 反射函数
  3. 综合使用

一、概述

  反射我们以后会经常用到,这个东西实现了动态的装配,通过字符串来反射类中的属性和方法

二、反射函数

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))
 
= 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))
 
= 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))
 
= 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))
 
= 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))
 
= 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 22in <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 21in <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))
 
= 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
    = getattr(d,choice)
    print(v)
 
#输出
>>>:name
shabi
hong
>>>:abc
None

面向对象【day08】:反射(五)的更多相关文章

  1. Python 面向对象之反射

    Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...

  2. Python之面向对象进阶------反射(Day26)

    一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Cla ...

  3. python 面向对象之反射及内置方法

    面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...

  4. 百万年薪python之路 -- 面向对象之 反射,双下方法

    面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...

  5. SOLID:面向对象设计的五个基本原则

    在程序设计领域,SOLID 是由罗伯特·C·马丁在 21 世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则.当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软 ...

  6. Python面向对象之-反射

    Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr  判断是否有改属性或者方法,有返回True,没有返回false getattr  如果是属性获得该属性 ...

  7. 面向对象之反射 与__str__等内置函数

    一  反射 1.面向对象中的反射:通过字符串的形式操作对象的相关属性,python中一切事物都是属性(都可以使用反射) 四个可以实现自省<反射>的函数:hasattr /  getattr ...

  8. day28 面向对象:反射,内置函数,类的内置方法

    面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...

  9. python基础之 面向对象之反射

    1.isinstance和issubclass issubclass(Son,Foo) 判断雷与类之间的是否有继承关系,接受两个参数,一个是疑似子类,一个是疑似父类,判断Son是否是Foo的子类 ob ...

  10. C++面向对象高级编程(五)类与类之间的关系

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming   OOP面向对象编 ...

随机推荐

  1. Java awt项目开发

    通过Java awt 界面上的知识编写的扫雷游戏 代码中有详细的注解 package com.langsin.saolei; import java.awt.Color;import java.awt ...

  2. 异常 try – finally 注意的地方

    finally 异常机制中还有一个重要的部分,就是finally, catch后面可以跟finally语句,语法如下所示:   try{ //可能抛出异常 }catch(Exception e){ / ...

  3. docker发现端口是tcp6的 导致无法访问前端

    最近偶尔发现一个比较奇怪的现象,netstat 查看监听的服务端口时,却只显示了 tcp6 的监控, 但是服务明明是可以通过 tcp4 的 ipv4 地址访问的,那为什么没有显示 tcp4 的监听呢? ...

  4. 二叉搜索树(BST)

    (第一段日常扯蛋,大家不要看)这几天就要回家了,osgearth暂时也不想弄了,毕竟不是几天就能弄出来的,所以打算过完年回来再弄.这几天闲着也是闲着,就掏出了之前买的算法导论看了看,把二叉搜索树实现了 ...

  5. CMake--Set用法

    CMake中的set用于给一般变量,缓存变量,环境变量赋值. cmake官方文档set set(<variable> <value> [[CACHE <type> ...

  6. elk认证模块x-pack安装

    一.elasticsearch安装x-pack elasticsearch/bin/elasticsearch-plugin install x-pack ######## -> Downloa ...

  7. 使用 jstack 查询线程死锁错误日志 定位问题

    定位问题 (1) 首先 找到相应的进程 使用 ps -ef | grep 'com.sankuai.qcs.regulation.dispatch' 找到进程的ID;==>21980 (2) t ...

  8. codeforces548B

    Mike and Fun CodeForces - 548B Mike and some bears are playing a game just for fun. Mike is the judg ...

  9. Twitter数据挖掘:如何使用Python分析大数据 (3)

    让我们来拉取Twitter账号@NyTimes的最近20条微博. 我们可以创建变量来存放待拉取的微博数量(即count),以及待拉取的用户(即name).然后用这两个参数调用user_timeline ...

  10. 自学Aruba3.1-Aruba配置架构-WLAN配置架构

    点击返回:自学Aruba之路 自学Aruba3.1-Aruba配置架构- WLAN配置架构  WLAN配置架构 1. AP group : Aruba无线控制器通过AP Group来构建无线网络配置参 ...