绑定方法与非绑定方法, 反射
绑定方法与非绑定方法
在类内部定义的函数, 分为两大类:
-
绑定方法: 绑定给谁, 就应该由谁来调用, 谁来调用就会把调用者当做第一个参数自动传入
绑定到对象的方法: 在类内部定义的没有任何装饰器修饰的
绑定到类的方法, 使用classmethod装饰器修饰
-
非绑定方法: 不与类或者对象绑定
import settings
class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def tell_info(self):
print("name:%s, age:%s, sex:%s" %(self.name,self.age,self.sex))
@classmethod #绑定方法到类, 不需要实例化, 直接调用, People.from_conf()
def from_conf(cls):
obj=cls(settings.name,settings.age,settings.sex)
return obj
@staticmethod #非绑定方法, 不强制给方法传参
def create_id():
m=hashlib.md5(str(time.time()).encode('utf-8'))
return m.hexdigest()
# settings content
# name='wtp'
# age=30
# sex='male'
# p=People('egon',18,'male')
# p.tell_info()
# name:egon, age:18, sex:male
# p=People.from_conf()
# p.tell_info()
# name:wtp, age:30, sex:male
反射
class test:
def __init__(self,name):
self.name1=name
def name(self,age):
print(age)
print(self.name1)
t=test('wtp')
choice='name'
print(hasattr(t,choice)) #判断对象t是否有name属性或方法
a=getattr(t,choice,None) #如果对象t有属性或方法name, 则获取属性name的值或者方法, 如果没有, 则返回None
a(18)
# 输出
# 18
# wtp
delattr(t,choice) #删除对象t的属性choice
print(getattr(t,choice))
setattr(t,'age',18) #为对象t增加属性age
print(t.age)
class Service:
def run(self,cmds):
func=cmds.split()
if hasattr(self,func[0]):
a=getattr(self,func[0])
a(cmds)
def get(self,cmds):
print('run ',cmds)
def put(self,cmds):
print('run ',cmds)
s=Service()
s.run('get txt')
# run get txt
s.run('put txt')
# run put txt