python八人比赛_python8之反射

一、概述

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

二、反射函数

2.1 hasarttr(obj,name_str)

作用:判断一个对象obj中是否有对应的name_str字符串的属性或者方法

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对象中的对应方法的内存地址或者对应属性的值

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

> #返回eat方法的内存地址

2.3 setattr(x,y,z)

作用:给obj对象添加一个新属性或者新方法,setattr(x, 'y', v) is equivalent to ``x.y = v''

①给对象新增一个新方法

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...

②给对象新增一个属性

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''

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

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

delattr(d,choice)

AttributeError: eat

三、综合使用

3.1 综合使用hasattr、getattr、setatt

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值