绑定方法与非绑定方法, 反射

绑定方法与非绑定方法, 反射

绑定方法与非绑定方法

在类内部定义的函数, 分为两大类:

  1. 绑定方法: 绑定给谁, 就应该由谁来调用, 谁来调用就会把调用者当做第一个参数自动传入

    ​ 绑定到对象的方法: 在类内部定义的没有任何装饰器修饰的

    ​ 绑定到类的方法, 使用classmethod装饰器修饰

  2. 非绑定方法: 不与类或者对象绑定

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
posted @ 2020-12-23 20:17  培天王  阅读(67)  评论(0编辑  收藏  举报