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__方法在子类中起的作用