Java教程

20. 绑定方法、反射

本文主要是介绍20. 绑定方法、反射,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

绑定方法与非绑定方法

绑定方法@classmethod

​ 将调用者本身当做第一个参数自动传入

  • 绑定给对象的方法:调用者是对象,自动传入的是对象
  • 绑定给类的方法:调用者是类,自动传入的是类
class Mysql:
    def __init__(self,ip,port):
        self.ip=ip
        self.port=port
    def func(self):
        print('%s:%s' %(self.ip,self.port))
    @classmethod  # 将下面的函数装饰成绑定给类的方法,传入参数时cls会自动将类的名称传入
    def from_conf(cls):
        print(cls)
        return cls(settings.IP, settings.PORT)

obj1=Mysql('1.1.1.1',3306)
obj2=Mysql.from_conf()
print(obj2.__dict__)

静态方法@staticmethod

# 封装的时候提到过
# 非绑定方法,也叫静态方法
# 没被绑定,任何人都可以调用,但是需要主动调用,不能自动传参
class Mysql:
    def __init__(self,ip,port):
        self.nid=self.create_id()
        self.ip=ip
        self.port=port

    @staticmethod  # 将下述函数装饰成一个静态方法,类和对象都可以使用
    def create_id():
        import uuid
        return uuid.uuid4()

    @classmethod  # 类方法
    def f1(cls):
        pass

    def f2(self):
        pass

print(Mysql.create_id)
print(obj1.create_id)

Mysql.create_id(1,2,3)
obj1.create_id(4,5,6)

反射

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

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

python中反射机制的实现很简单,提供了几个方法

内置函数hasattr、getattr、setattr、delattr的使用
'''
class Teacher:
    def __init__(self,name,age):
        self.name =name
        self.age =age

t=Teacher('Libai',12)

# hasattr(object,'name')
hasattr(t,'name')  # 判断有无属性t.name,返回true和false

# getattr(object, 'name', default=None)
getattr(t,'name',None)  # 存在属性name返回属性值,不存在则返回默认值None

# setattr(object, 'name', value)
setattr(t,'age',18)  # 设置属性值t.age=18

# delattr(object, 'name')
delattr(t,'age') # 等同于del t.age,删除该属性,属性不存在时会报错

上面的属性实际上是字符串,这是有原因的,在进行交互时,计算机收到的数据一般是字符串形式,这样的设计有助于我们进行交互操作

除此之外,内置函数dir(object)能够获取类或者对象的属性列表,列表中全为字符串格式

有必要说一下学会了反射之后会有什么变化

# 学习反射之前我们如何处理判断
class User:
    def login(self):
        print('欢迎来到登录页面')
    
    def register(self):
        print('欢迎来到注册页面')
    
while 1:
    choose = input('>>>').strip()
    if choose == 'login':
        obj = User()
        obj.login()
    
    elif choose == 'register':
        obj = User()
        obj.register()
        

# 学习反射之后:
class User:
    def login(self):
        print('欢迎来到登录页面')
    
    def register(self):
        print('欢迎来到注册页面')

user = User()
while 1:
    choose = input('>>>').strip()
    if hasattr(user,choose):
        func = getattr(user,choose)
        func()
    else:
        print('输入错误!!!') 
这篇关于20. 绑定方法、反射的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!