Python 内置函数(反射类)
简介
python内置了一系列的常用函数,以便于我们使用,python英文官方文档详细说明:点击查看。
反射类操作
-
callable()
用于检查一个对象是否是可调用的。如果返回 True,object 仍然可能调用失败;但如果返回 False,调用对象 object 绝对不会成功。
注意!对于函数、方法、lambda 函式、 类以及实现了 _ _ call _ _ 方法的类实例, 它都返回 True。
>>> def add(a, b): ... return a + b ... >>> callable(add) # 函数返回 True True >>> class B: ... def __call__(self): ... return 0 ... >>> callable(B) True
-
classmethod()
对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
class A(object): bar = 1 def func1(self): print ('foo') @classmethod def func2(cls): print ('func2') print (cls.bar) cls().func1() # 调用 foo 方法 A.func2() # 不需要实例化
-
staticmethod()
返回函数的静态方法。该方法不强制要求传递参数
class main:#先声明类 def set(self, x): #普通方法 print(x) @staticmethod #类方法 def run(n): print(n) o = main() #普通方法需要实例化后才能调用 o.set('abc') #输出 abc main.run(123) #类方法可以直接使用,不需要实例化 #输出 123
-
compile()
将字符串代码或者代码文件解析转化为可执行代码或AST对象,根据代码的内容和类型分别由exec()、eval()两个函数进行执行。
注意!
1.当source包含一些列语句(例如for循环语句)应当使用exec模式
2.当source为单个表达式组成应当使用eval模式
3.当source由单个交互式语句组成(例如input)则应当使用single模式。
#实例一:
l = "for i in ['aaaaa', 'bbbbb', 'ccccc', 'ddddd', 'eeeee']: print(i)"
c = compile(l, '', 'exec')
exec(c)
#结果
aaaaa
bbbbb
ccccc
ddddd
eeeee
#实例二:
s = "print(30 + 5 - 10)"
c = compile(s,'','eval')
eval(c)
#结果
25
#实例三:
p = 'input("请输入你的生日:")'
c = compile(p, '', 'single')
exec(c)
#结果
请输入你的生日2010-10-10
'2010-10-10'
-
dir
-
获取当前本地名称列表
>>> dir() ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
-
获取模块属性列表
>>> import sys >>> dir(sys) ['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache',。。。。(此处省略一万字)
-
获取类的有效属性列表
>>> class main: ... a = 1 ... b = 2 ... c = 3 ... def run(self): ... print(123) >>> o = main() >>> dir(o) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b', 'c', 'run']
-
获取dir()设置的属性列表
>>> class main: ... a = 1 ... b = 2 ... c = 3 ... def run(self): ... print(123) ... def __dir__(self): ... return ['d', 'e', 'f'] >>> o = main() >>> dir(o) ['d', 'e', 'f']
-
-
eval()
用来执行一个字符串表达式,并返回表达式的值
>>>x = 7 >>> eval( '3 * x' ) 21 >>> eval('pow(2,2)') 4 >>> eval('2 + 2') 4
-
exec()
执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码
>>>exec('print("Hello World")') Hello World # 单行语句字符串 >>> exec("print ('runoob.com')") runoob.com # 多行语句字符串 >>> exec ("""for i in range(5): ... print ("iter time: %d" % i) ... """) iter time: 0 iter time: 1 iter time: 2 iter time: 3 iter time: 4
-
filter()
用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象
def odd(n): return n % 2 == 1 tmp = filter(odd,range(1,20)) print(list(tmp)) #结果 [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
-
getattr()
返回一个对象属性值,如果没有,可以设置
>>> class A(object): bar = 1 a = A() >>> print(getattr(a,'bar')) #获取属性bar的值 1 >>> print(getattr(a,'bar2')) #属性bar2不存在,触发异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'A' object has no attribute 'bar2' >>> print(getattr(a,'bar2',3)) #属性bar2不存在,但设置了默认值。 3
-
setatt()
对应函数 getattr(),用于设置属性值,该属性不一定是存在的。
>>>class A(object): ... bar = 1 ... >>> a = A() >>> getattr(a, 'bar') # 获取属性 bar 值 1 >>> setattr(a, 'bar', 5) # 设置属性 bar 值 >>> a.bar 5
-
globals()
会以字典类型返回当前位置的全部全局变量。
>>> print(globals()) {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 'baidu'}
-
hasattr()
用于判断对象是否包含对应的属性。
class Coordinate: x = 10 y = -5 z = 0 point1 = Coordinate() print(hasattr(point1, 'x')) print(hasattr(point1, 'y')) print(hasattr(point1, 'z')) print(hasattr(point1, 'no')) # 没有该属性 #结果 True True True False
-
hash()
-
用于获取取一个对象(字符串或者数值等)的哈希值。
-
可以应用于数字、字符串和对象,不能直接应用于 list、set、dictionary。
-
函数的对象字符不管有多长,返回的 hash 值都是固定长度的,也用于校验程序在传输过程中是否被第三方(木马)修改。
hash('test')
456767774483869837
hash(1)
1
hash(str([1,2,3,4,5]))
593718760398909611
-
-
id()
返回对象的内存地址
>>> a = 1 >>> id(a) 8791233520464
-
isinstance()
来判断一个对象是否是一个已知的类型
>>> id(a) 8791233520464 >>> a = 2 >>> isinstance(a,str) False >>> isinstance(a,int) True
-
type()
如果只有第一个参数则返回对象的类型,三个参数返回新的类型对象。
#一个参数 >>> type(1) <type 'int'> >>> type('baidu') <type 'str'> #三个参数 >>> class X(object): a = 1 >>> X = type('X',(object,),dict(a=1)) >>> X <class '__main__.X'>
-
issubclass()
用于判断参数 class 是否是类型参数 classinfo 的子类。
>>> class A: pass >>> class B(A): pass >>> print(issubclass(B,A)) True
-
len()
返回对象(字符、列表、元组等)长度或项目个数。
>>>str = "runoob" >>> len(str) # 字符串长度 6 >>> l = [1,2,3,4,5] >>> len(l) # 列表元素个数 5
-
local()
会以字典类型返回当前位置的全部局部变量。
#实例一: >>>def runoob(arg): # 两个局部变量:arg、z ... z = 1 ... print (locals()) ... >>> runoob(4) {'z': 1, 'arg': 4} # 返回一个名字/值对的字典 #实例二: >>> out = 1 #声明全局变量out。 >>> def run(inside): #声明方法,方法有一个inside参数。 ... print(locals()) ... >>> run(5) #运行方法 #结果 {'inside':5} #实例三: class A(object):#声明类 bar = 1 def run(self): print(locals()) app = A()#实例化类 app.run()#运行类中的方法run #结果 {'self': <__main__.A object at 0x0000000002517CC0>}
-
map()
会根据提供的函数对指定序列做映射。
def fun(x): return x ** 2 print(list(map(fun, [1,2,3,4,5]))) #结果 [1, 4, 9, 16, 25]
-
memoryview()
返回给定参数的内存查看对象(Momory view)。
>>>v = memoryview(bytearray("abcefg", 'utf-8')) >>> print(v[1]) 98 >>> print(v[-1]) 103 >>> print(v[1:4]) <memory at 0x10f543a08> >>> print(v[1:4].tobytes()) b'bce'
-
next()
返回迭代器的下一个项目。
a = iter([1,2,3,4,5]) while 1: #循环 try: x = next(a) #获得下一个值 print(x) except StopIteration: break #遇到异常退出循环 #结果 1 2 3 4 5
-
property()
主要作用是设置类属性的方法,用于指定属性的获取、修改和删除的对应方法,可以增加对属性的限制,例如验证、过滤、二次处理等。
class User(): def __init__(self): self._age = 0 def getAge(self): print('正在获取年龄') return self._age def setAge(self,value): print('正在设置年龄') self._age = value def delAge(self): print('正在删除年龄属性') del self._age age = property(getAge,setAge,delAge,'这是设置年龄的属性') u = User() >>> u.age = 18 #结果 正在设置年龄属性 >>> u.age #结果 正在获取年龄属性 del u.age #结果 正在删除年龄属性 >>> help(User.age) Help on property: 这是设置年龄的property属性
需要注意的是,虽然我们将getAge,setAge,delAge这三个方法设置给了age属性,但是它们同时也属于类本身,实例化后可以直接被调用,换句话说,这三个方法也暴露给了外部,在一些特定的情况下可能会造成一些混乱,这可能不会是严重的问题。
-
repr()
将对象转化为供解释器读取的形式。
>>>s = 'RUNOOB' >>> repr(s) "'RUNOOB'" >>> dict = {'runoob': 'runoob.com', 'google': 'google.com'}; >>> repr(dict) "{'google': 'google.com', 'runoob': 'runoob.com'}" >>>
-
slice()
实现切片对象,主要用在切片操作函数里的参数传递。
>>> s = slice(5,7) >>> l = [1,2,3,4,5,6,7,8,9,10] >>> l[s] [6, 7]
-
super()
用于调用父类(超类)的一个方法。
class A: def add(self, x): y = x+1 print(y) class B(A): def add(self, x): super().add(x) b = B() b.add(2) # 3
-
vars()
返回对象object的属性和属性值的字典对象。
>>> class X(object): a = 1 >>> print(vars(X)) {'a': 1, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'X' objects>, '__weakref__': <attribute '__weakref__' of 'X' objects>, '__doc__': None}
-
bytearray()
返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。
>>> bytearray() bytearray(b'') >>> bytearray([1,2,3]) bytearray(b'\x01\x02\x03') >>> bytearray('baidu','utf-8') bytearray(b'baidu')