文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python27 反射

2023-01-31 06:43

关注

反射:通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法

1.getattr:
2.hasattr:判断一个对象里是否有对应(相同名称)字符串的方法
3.setattr
4.delattr
class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self):
        print ('%s is eating...'% self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()   #让用户输入项调用Dog类中的功能(方法)

d.choice()

image_1c17eg6q8fcj1td2bnq1jo01vnb9.png-13.4kB
图中输入choice的内容是一个字符串,正常调用d.eat()这可不是一个字符串。
报错提示Dog中不存在attribute choice(字符串)


class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self):
        print ('%s is eating...'% self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()   

print (hasattr(d,choice))   #判断对象d里是否有对应eat字符串的方法    #hasattr的全称就是hasattribute(有没有属性....)

执行结果:
>>:eat
True    #通过这种方式就可以确认在class Dog中是否存在eat功能了

执行结果:
>>:talk
False

class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self):
        print ('%s is eating...' % self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()

if hasattr(d,choice):   #如果d中存在eat
    getattr(d,choice)()  #就用getattr调用d.eat,后面不加括号的话就是打印内存信息了
#根据字符串去获取d对象里的方法的内存地址
执行结果:
>>:eat
XiaoBai is eating...
class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food): #设置food参数
        print ('%s is eating...' % self.name,food)

d = Dog('XiaoBai')
choice = input('>>:').strip()

if hasattr(d,choice):
    func = getattr(d,choice) #当前func==d.eat
    func('Bone')    #将Bone传给food参数
setattr()
我们通过ctrl点进去setattr中

image_1c17gckbcjhda4k1v8p1q2km16m.png-16.9kB
x表示对象
y被引号引着表示y是字符串
x.y=v v相当于值

class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print ('%s is eating...' % self.name,food)

def bulk(self):
    print ('%s is yelling.....' %self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()

if hasattr(d,choice):
    func = getattr(d,choice)
    func('Bone')
else:
    setattr(d,choice,bulk)  #将bulk赋值给choice(这里choice=talk,也就相当于赋值给talk)
    d.talk(d)
    #这里choice=talk,这里d.talk=bulk,bulk本身是一个函数内存地址,将这个内存地址赋值给了talk,当前talk相当于bulk这个函数了,所以调用d.talk就相当于调用bulk这个函数,而d.bulk则是不存在的.

执行结果:
>>:talk
XiaoBai is yelling.....
class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print ('%s is eating...' % self.name,food)

def bulk(self):
    print ('%s is yelling.....' %self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()

if hasattr(d,choice):
    func = getattr(d,choice)
    func('Bone')
else:
    # setattr(d,choice,bulk)
    # d.talk(d)
    setattr(d,choice,22)    #建立一个新的、不存在的静态属性,赋予值22
    print (getattr(d,choice))

执行结果:
>>:age  #建立的静态属性名称为age,然后得到赋值22
22

执行结果:
>>:name     #这里输入已存在的变量名
Traceback (most recent call last):
  File "E:/Python/练习代码/A1.py", line 20, in <module>
    func('Bone')
TypeError: 'str' object is not callable
#因为name的值已经通过func = getattr(d,choice)获取了,不能通过func('Bone')这样调用
class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print ('%s is eating...' % self.name,food)

def bulk(self):
    print ('%s is yelling.....' %self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()

if hasattr(d,choice):

    setattr(d,choice,'LeLe')    #设置已有属性的值(相当于更改了)

else:
    # setattr(d,choice,bulk)
    # d.talk(d)
    setattr(d,choice,22)
    print (getattr(d,choice))

print (d.name)

执行结果:
>>:name
LeLe    #可以看到已经不是XiaoBai了,是改过的LeLe
class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print ('%s is eating...' % self.name,food)

def bulk(self):
    print ('%s is yelling.....' %self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()

if hasattr(d,choice):

    delattr(d,choice)   #删除属性

else:
    # setattr(d,choice,bulk)
    # d.talk(d)
    setattr(d,choice,22)
    print (getattr(d,choice))

print (d.name)

执行结果:
>>:name     #指定删除name这个属性
Traceback (most recent call last):
  File "E:/Python/练习代码/A1.py", line 28, in <module>
    print (d.name)
AttributeError: 'Dog' object has no attribute 'name'
#可以看到name属性已不存在
class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print ('%s is eating...' % self.name,food)

def bulk(self):
    print ('%s is yelling.....' %self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()

if hasattr(d,choice):

    getattr(d,choice)

else:
    setattr(d,choice,None)
    print (d.choice)    #这里是不能这么打印的,这里的choice只是单纯的一个叫choice的字符串,而不是choice = input输入的值。
    AA = d.choice

print (d.name)

执行结果:
>>:age
Traceback (most recent call last):
  File "E:/Python/练习代码/A2.py", line 25, in <module>
    print (d.choice)
AttributeError: 'Dog' object has no attribute 'choice'
class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print ('%s is eating...' % self.name,food)

def bulk(self):
    print ('%s is yelling.....' %self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()

if hasattr(d,choice):

    getattr(d,choice)

else:
    setattr(d,choice,None)
    AA = getattr(d,choice)      #需要先通过getattr获取这个choice的值
    print (AA)

执行结果:
>>:age
None
class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print ('%s is eating...' % self.name,food)

def bulk(self):
    print ('%s is yelling.....' %self.name)

d = Dog('XiaoBai')
choice = input('>>:').strip()

if hasattr(d,choice):

    getattr(d,choice)

else:
    setattr(d,choice,None)
    print (d.age)   #这个age就是choice=input输入的值,因为age存在所以可以直接打印
    AA = getattr(d,choice)      #需要先通过getattr获取这个choice的值
    print (AA)

执行结果:
>>:age
None    #print (d.age)
None    #print (AA)
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯