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('输入错误!!!')

浙公网安备 33010602011771号