python 常用内置函数
-import
函数功能用于动态的导入模块,接收一个字符串,主要用于反射或者延迟加载模块
import(module)相当于import module
导入a.b,如果b不是模块,就会报错,如果b是模块,只会导入a
a=__import__('a.b') print(a) ## module 'a' from 'D:\\code\\flask_demo\\a\\__init__.py
- doc
方法通常会输入指定对象中的注释部分
class ClassName: ''' 这个是我定义的类的注释 ''' def __init__(self): ''' 这是一个类属性 ''' index = ClassName() print(index.__doc__) # print(index.__doc__) print(index.__init__.__doc__) # 这是一个类属性
-dir
dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表
>>>dir() # 获得当前模块的属性列表 ['__builtins__', '__doc__', '__name__', '__package__', 'arr', 'myslice'] >>> dir([ ]) # 查看列表的方法 ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] >>>
-dict
为了方便用户查看类中包含哪些属性,Python 类提供了 dict 属性。需要注意的一点是,该属性可以用类名或者类的实例对象来调用,用类名直接调用 dict,会输出该由类中所有类属性组成的字典;而使用类的实例对象调用 dict,会输出由类中所有实例属性组成的字典。
a=__import__('a.b') print(a) ## module 'a' from 'D:\\code\\flask_demo\\a\\__init__.py
程序输出结:
{'__module__': '__main__', 'a': 1, 'b': 2, '__init__': <function CLanguage.__init__ at 0x0000022C69833E18>, '__dict__': <attribute '__dict__' of 'CLanguage' objects>, '__weakref__': <attribute '__weakref__' of 'CLanguage' objects>, '__doc__': None} {'name': 'C语言中文网', 'add': 'http://c.biancheng.net'}
- getattribute__与__getattr
都是可以用字符串获取属性
class A(object): def __init__(self): self.name = "Bob" self.age = 18 self.gender = "male" if __name__ == "__main__": a = A() print(a.name) print(a.age) print(a.gender) # 输出: #Bob #18 #male
可以用__getattribute__方法拦截属性,实现我们想要实现的逻辑
class A(object): def __init__(self): self.name = "Bob" self.age = 18 self.gender = "male" def __getattribute__(self, attr): # 拦截age属性 if attr == "age": return "问年龄是不礼貌的行为" # 非age属性执行默认操作 else: return object.__getattribute__(self, attr) if __name__ == "__main__": a = A() print(a.age) print(a.name) print(a.gender) # 输出: #问年龄是不礼貌的行为 #Bob #male
class A(object): def __init__(self): self.name = "Bob" self.age = 18 self.gender = "male" def __getattr__(self, attr): return eval("self."+attr.lower()) #即:再次去执行__getattribute__方法 if __name__ == "__main__": a = A() print("a.name -> {}".format(a.name)) print("a.NAME -> {}".format(a.NAME)) print("a.Name -> {}".format(a.Name)) print("a.NaME -> {}".format(a.NaME)) # 输出: #a.name -> Bob #a.NAME -> Bob #a.Name -> Bob #a.NaME -> Bob 无论是a.NAME,a.Name,还是a.NaME等等,即n a m e(包含大小写)四个元素组成的属性,访问结果都同a.name一样
注意:
1.__getattribute__方法优先级比__getattr__高
2.只有在__getattribute__方法中找不到对应的属性时,才会调用__getattr__
3.如果是对不存在的属性做处理,尽量把逻辑写在__getattr__方法中
4.如果非得重写__getattribute__方法,需要注意两点:第一是避免.操作带来的死循环;第二是不要遗忘父类的__getattribute__方法在子类中起的作用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?