Python3 从零单排20_方法(绑定&内置)&反射

  非绑定方法 没有自动传值的功能 @staticmethod
  绑定方法 绑定给谁就给谁调用,调用时会自动将调用者作为第一个参数传递给函数
  1.绑定到对象的方法(不被任何装饰器装饰的函数)
  2.绑定到类的方法 @classmethod 装饰的函数
class A:
    def __init__(self, name):
        self.name = name

    def call(self):  # 绑定到对象的方法,对象调用时默认将调用者作为第一个参数自动传入,类也可调用,但只是作为一个普通函数给类用,不会自动传值。
        print("my name is %s" % self.name)

    @classmethod  # 绑定到类的方法,类调用时默认将调用者作为第一个参数自动传入,对象调用时默认将调用者所属的类作为第一个参数自动传入。
    def func_class(cls):  # 一般写成 cls 与绑定到对象时写的self做区分,两个功能其实是一样的
        print(cls)

    @staticmethod  # 类和对象都可以直接使用,当普通函数那样使用
    def cal(x, y):
        print(x+y)


a1 = A("xg")
# # 调用对象绑定方法
# a1.call()
# A.call(a1)
# # 调用类绑定方法
# A.func_class()
# a1.func_class()
# # 调用非绑定方法
# A.cal(1,2)
# a1.cal(1,2)

 

反射
# 对象的属性操作,实际做的增删改查就是操作对象的 __dict__属性字典 , 类的属性操作类似
# 判断是否含有属性
print(hasattr(a1, "name"))  # true
# 拿到属性值
print(getattr(a1, "name"))  # 当不存在该属性时,会报错
print(getattr(a1, "asd", None))  # 指定None,当不存在该属性时,不会报错
# 设置属性值
setattr(a1, "sex", "male")
print(getattr(a1, "sex", None))
# 删除属性
delattr(a1, "sex")
print(getattr(a1, "sex", None))

# 反射的应用  类似于功能分发
class Service:
    def run(self):
        while True:
            inp=input('>>: ').strip() #cmd='get a.txt'
            cmds=inp.split() #cmds=['get','a.txt']

            # print(cmds)
            if hasattr(self,cmds[0]):
                func=getattr(self,cmds[0])
                func(cmds)


    def get(self,cmds):
        print('get.......',cmds)


    def put(self,cmds):
        print('put.......',cmds)


obj=Service()
obj.run()

 

内置方法:
# isinstance(obj,cls)检查是否obj是否是类 -cls 的对象
class Foo(object):
    pass
obj = Foo()
isinstance(obj, Foo)

# issubclass(sub, super)检查sub类是否是 super 类的派生类
class Foo(object):
    pass
class Bar(Foo):
    pass
issubclass(Bar, Foo)


# item 将对象变成一个字典形式
class A:
    def __init__(self, name):
        self.name = name

    def __getitem__(self, item):  # 当用字典形式查对象的属性时,会自动调用该方法
        print("getitem ....")
        return self.__dict__.get(item)

    def __setitem__(self, key, value):  # 当用字典形式设置对象的属性时,会自动调用该方法
        print("setitem ....")
        self.__dict__[key] = value

    def __delitem__(self, key):  # 当用字典形式删除对象的属性时,会自动调用该方法
        print("delitem ....")
        self.__dict__.pop(key)


a = A("xg")
print(a["name"])
a["sex"] = 'male'
print(a["sex"])
del a["sex"]
print(a["sex"])


posted @ 2018-12-19 17:23  毛斯钢  阅读(203)  评论(0编辑  收藏  举报