反射:通过字符串映射或修改程序运行时的状态、属性、方法, 有以下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)