反射(映射,自省)

反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

如下可以用hasattr判断是否含有叫做“abc”的属性,若有便会执行,反之则不会

class Person():
    def __init__(self ,name ,age):
        self.name = name
        self.age = age
p = Person("Alex" ,22)
if hasattr(p,"abc"):#映射
	print("...")

反射四种方法:
getattr() ——get
hasattr() ——判断
setattr() ——赋值
delattr() ——删除

例子:

class Person():
    def __init__(self ,name ,age):
        self.name = name
        self.age = age

    def walk(self):
        print("walking....")

def talk(self):
    print(self.name ,"is speaking.....")

p = Person("Alex" ,22)
if hasattr(p,"name"): # 映射
    print("l.......")

hasattr() ——判断

user_command = input(">>:").strip()
if hasattr(p,user_command):
	func = getattr(p,user_command)
	func()

getattr() ——get

a = getattr(p,"age")
print(a)

setattr() ——赋值

## static 属性
setattr(p,"sex","Female")
print(p.sex)
## 方法
setattr(p,"speak",talk)
p.speak(p)
setattr(Person,"speak2",talk)#对类直接绑定的话,实例调用不用手动传p
p.speak()

delattr() ——删除

delattr(p,"age")#跟del p.age相同

反射的应用

了解了反射的四个函数。那么反射到底有什么用呢?它的应用场景是什么呢?

现在让我们打开浏览器,访问一个网站,你单击登录就跳转到登录界面,你单击注册就跳转到注册界面,等等,其实你单击的其实是一个个的链接,每一个链接都会有一个函数或者方法来处理。

没学反射之前的解决方式

class User:
    def login(self):
        print('欢迎来到登录页面')
    def register(self):
        print('欢迎来到注册页面')
    def save(self):
        print('欢迎来到存储页面')
while 1:
    choose = input('>>>').strip()
    if choose == 'login':
        obj = User()
        obj.login()
    elif choose == 'register':
        obj = User()
        obj.register()
    elif choose == 'save':
        obj = User()
        obj.save()

学了反射之后解决方式

class User:
    def login(self):
        print('欢迎来到登录页面')
    def register(self):
        print('欢迎来到注册页面')
    def save(self):
        print('欢迎来到存储页面')
user = User()
while 1:
    choose = input('>>>').strip()
    if hasattr(user,choose):
        func = getattr(user,choose)
        func()
    else:
        print('输入错误。。。。')

对于__name__补充

print(__name__) # __main__ 就代表模块本身, self.

if __name__ == "__main__": #只会在被别的模块导入的时候发挥作用
    print("hahahah")

#print('hahaha')

name 在当前模块主动执行的情况下(不是被导入执行),等于__main__
在被其他模块导入执行的情况下,模块名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值