Python-----函数vs方法,反射,特殊的双下方法

it2022-05-05  104

1.函数vs方法

# len() # print() # zip() # str.count() # str.split() # # def func(): # pass # # # class A: # # def func(self): # pass # 1 通过函数名可以大致判断 # print(func) # <function func at 0x00000000005D1EA0> # obj = A() # print(obj.func) # <bound method A.func of <__main__.A object at 0x0000000001DE1CF8>> # 2. 通过types模块去验证 from types import FunctionType from types import MethodType def func(): pass class A: def func(self): pass @staticmethod def f(): pass # print(isinstance(func, FunctionType)) # print(isinstance(func, MethodType)) # 类名调用func 就是一个函数 # print(isinstance(A.func, FunctionType)) # print(isinstance(A.func, MethodType)) # obj = A() # 对象调用func 就是一个方法 # print(isinstance(obj.func, FunctionType)) # print(isinstance(obj.func, MethodType)) # 对于静态方法的研究 # print(isinstance(A.f, FunctionType)) # print(isinstance(A.f, MethodType)) # obj = A() # # 对象调用func # print(isinstance(obj.f, FunctionType)) # print(isinstance(obj.f, MethodType)) # 函数与方法 # 函数: 全都是显性传参 # 方法: 存在隐性传参

2.反射

从实例的角度去研究反射 # class A: # # static_field = '静态属性' # # def __init__(self, name, age): # self.name = name # self.age = age # # def func(self): # print('in A func') # # # obj = A('MC骚Q', 18) # print(obj.name) # # # print(hasattr(obj,'name')) # *** # print(getattr(obj,'name1',None)) *** # setattr(obj,'hobby', '玩') * # print(getattr(obj,'hobby')) # print(obj.hobby) # delattr(obj,'name') * # print(hasattr(obj,'name')) # if hasattr(obj, 'static_field'): # print(getattr(obj,'static_field')) # # if hasattr(obj, 'func'): # # print(getattr(obj,'func')) # getattr(obj,'func')() # 从类的角度研究反射 # # class A: # # static_field = '静态属性' # # def __init__(self, name, age): # self.name = name # self.age = age # # def func(self): # print(self) # print(self.name) # print('in A func') # # print(hasattr(A,'static_field')) # print(getattr(A,'static_field')) # obj = A('大表哥', 18) # # print(getattr(A, 'func')) # getattr(A,'func')(obj) # 从当前脚本研究反射 # def func1(): # print('in func1') # # def func2(): # print('in func2') # def func3(): # print('in func3') # l1 = [func1, func2, func3] # l1 = [f'func{i}' for i in range(1,4)] # class B: # static = 'B类' import sys # print(sys.modules) this_modules = sys.modules[__name__] # 获取当前脚本这个对象 # print(this_modules) # print(getattr(this_modules,'func1')) # getattr(this_modules,'func1')() # cls = getattr(this_modules,'B') # obj = cls() # print(obj.static) # l1 = [f'func{i}' for i in range(1,4)] # for i in l1: # getattr(this_modules, i)() # # def func1(): # print('in func1') # # func1() # # def func2(): # print('in func2') # 在其他模块研究反射 # import other_modules as om # # om.test() # getattr(om, 'test')() # class Auth: # # function_list = [('login','请登录'), ('register','请注册'), ('exit', '退出')] # # def login(self): # print('登录函数') # # # def register(self): # print('注册函数') # # # def exit(self): # print('退出...') # # # while 1: # obj = Auth() # for num,option in enumerate(obj.function_list,1): # print(num,option[1]) # choice_num = input('请输入选择:').strip() # if hasattr(obj,func_name): # getattr(obj,func_name)()

3.Python中特殊的双下方法

class A: # # def __init__(self,name,age,hobby): # # self.name = name # self.age = age # self.hobby = hobby # # print(111) # # def __len__(self): # # print('触发__len__方法') # return len(self.__dict__) # obj = A('MC骚亚伟') # __len__ # obj = A('MC骚亚伟',18, '抽烟') # # ret = len(obj) # print(ret) # 一个对象之所以可以使用len()函数,根本原因是这个对象从输入的类中有__len__方法, # print(ret) # len('srtfdsf') # str # __hash__ # class A: # # pass # hash(obj) 会调用obj这个对象的类(基类)的__hash__方法 # obj = A() # print(hash(obj)) # object # __str__ __repr__ *** # class Student: # # def __init__(self,name,age,sex): # self.name = name # self.age = age # self.sex = sex # # # # def __repr__(self): # return f'姓名:{self.name}年龄:{self.age}性别:{self.sex}' # # def __str__(self): # return f'姓名:{self.name}年龄:{self.age}性别:{self.sex}666' # # obj = Student('小智', 18, '男') # obj1 = Student('dj智', 18, '男') # obj2 = Student('mc智', 18, '男') # # # print(str(obj)) # # print(str(obj)) # 会触发__str__ # # print(obj) # 打印输出实例会触发__str__ # # print(obj1) # # print(obj2) # # print('此对象为%s' %obj) # 格式化输出会触发__str__ # # print(obj) # 触发__repr__ # print('此对象是%r' %obj) # 触发__repr__ # # # print(obj) 先触发__str__方法 # __call__方法 # class A: # def __init__(self): # self.a = 1 # print(111) # # def __call__(self, *args, **kwargs): # print(666) # # obj = A() # obj() # class A: # def __init__(self): # self.a = 1 # self.b = 2 # # def __eq__(self,obj): # print(111) # return True # # if self.a == obj.a and self.b == obj.b: # # return True # a = A() # b = A() # print(a == b) # 对一个类的两个对象进行比较操作,就会触发__eq__方法 # __del__ 析构方法 # class A: # # def __del__(self): # print(111) # # obj = A() # del obj # l1 = [1,2,3] # dic = {1:2} # del l1 # del dic # 主动删除 # # print(dic) # print(111) # print(222) # __new__ 构造方法 # __new__创造并返回一个新对象. # class A(object): # # def __init__(self): # print('in __init__') # # def __new__(cls, *args, **kwargs): # # print(cls) # A # print('in __new__') # object1 = object.__new__(cls) # return object1 # obj = A() # 类名() 先触发__new__ 并且将类名自动传给cls. # print(obj) # 单例模式 # 一个类只能实例化一个对象,无论你实例化多少次,内存中都只有一个对象. # class A: # pass # obj = A() # obj1 = A() # obj2 = A() # print(obj,obj1,obj2) # 面试几乎都会让你手写一个单例模式 # 这个类的对象不是个性化的,主要是实例化对象之后去执行类中的方法. # class A: # __instance = None # # def __new__(cls, *args, **kwargs): # if not cls.__instance: # object1 = object.__new__(cls) # cls.__instance = object1 # return cls.__instance # # # obj = A() # obj1 = A() # obj2 = A() # print(obj,obj1,obj2) # __item__ # 对对象进行类似于字典的操作 # # class Foo: # def __init__(self, name): # self.name = name # # def __getitem__(self, item): # print(item) # print('get时 执行我') # # def __setitem__(self, key, value): # self.name = value # print('set时执行我') # # def __delitem__(self, key): # print(f'del obj{[key]}时,我执行') # # obj = Foo('御姐') # # obj.__dict__ # # obj['name'] # # obj['name'] = '萝莉' # # print(obj.name) # del obj['name'] # __enter__ __exit__ # class A: # def __init__(self,name): # self.name = name # # def __enter__(self): # print(111) # # def __exit__(self, exc_type, exc_val, exc_tb): # print(222) # # # obj = A('mc小龙') # # # 对一个对象类似于进行with语句上下文管理的操作, 必须要在类中定义__enter__ __exit__ # with A('mc小龙') as obj: # print(555) # # print(obj.name) # class A: # # def __init__(self, text): # self.text = text # # def __enter__(self): # 开启上下文管理器对象时触发此方法 # self.text = self.text + '您来啦' # return self # 将实例化的对象返回f1 # # def __exit__(self, exc_type, exc_val, exc_tb): # 执行完上下文管理器对象f1时触发此方法 # self.text = self.text + '这就走啦' # # # f1 = A('大爷') # with A('大爷') as f1: # print(f1.text) # print(f1.text)

转载于:https://www.cnblogs.com/hql1117/p/11178131.html

相关资源:Python 关于反射和类的特殊成员方法

最新回复(0)