将调用者本身当做第一个参数自动传入
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__)
# 封装的时候提到过 # 非绑定方法,也叫静态方法 # 没被绑定,任何人都可以调用,但是需要主动调用,不能自动传参 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('输入错误!!!')