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"])
夕闻道不如朝闻道