一,反射
# 什么是反射?
# 指的是在程序运行过程中可以"动态(不见棺材不掉泪)"获取对象的信息
# 动态:是指在定一个一个函数时比如x=5,不需要指定5是是否是init类型,在执行的时候会去识别类型
# 为何要用反射?
# 如何实现反射?
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def say(self):
print('%s:%s' %(self.name,self.age))
obj=People('mzz',13)
# 在肉眼可见知道类People下面有可调用的say,才能执行一下
obj.say()
# mzz:13
# 如果不知道类下面有哪些可以调用,使用dir查看类下面有哪些属性
print(dir(obj))
#['__class__', '__delattr__', '__dict__', '__dir__',....... 'age', 'name', 'say']
# 以上的基础上,可以用索引方式调出属性的名字
print(dir(obj)[-2])
# name
# 调用属性的值
print(obj.__dict__['age'])
#13
print(obj.__dict__[dir(obj)[-2]])
# mzz
# 实现反射机制的步骤
# 1、先通过多dir:查看出某一个对象下可以.出哪些属性来
# print(dir(obj))
# 2、可以通过字符串反射到真正的属性上,得到属性值
# print(obj.__dict__[dir(obj)[-2]])
二,四个内置函数
1,使用
# 四个内置函数的使用:通过字符串来操作属性值
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def say(self):
print('%s:%s' %(self.name,self.age))
obj=People('mzz',13)
#1)hasattr 判断obj是否有name这个属性,注意name一定要加上引号
print(hasattr(obj,'name')) #对象obj是否有name
# True
print(hasattr(obj,'xxx'))
# False
#2) getattr 在hasattr为True的基础上,通过getattr得到属性的值
print(hasattr(obj,'name'))
# True
print(getattr(obj,'name'))
# mzz
#3)setattr
setattr(obj,'name','xiaohua') # 把obj里的name值更改为xiaohua,这里的name本身存在
print(obj.__dict__)
# {'name': 'xiaohua', 'age': 13}
setattr(obj,'hobby','sing') # obj里添加属性hobby,值为sing,这里的hobby本身不存在
print(obj.__dict__)
# {'name': 'xiaohua', 'age': 13, 'hobby': 'sing'}
# #PS:以上的obj是自定义,如果是内置,,如下,不能够增加属性
# x=10
# setattr(x,'name','mzz')
# print(x.__dict__) # 会报错 AttributeError: 'int' object has no attribute 'name'
#4)delattr 删除
print(obj.__dict__)
# {'name': 'xiaohua', 'age': 13, 'hobby': 'sing'}
delattr(obj,'name')
print(obj.__dict__)
# {'age': 13, 'hobby': 'sing'}
2,示例
#例1
# 在hasattr为False的情况下调用没有的属性会报错,用if判断防止报错,如下
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def say(self):
print('%s:%s' %(self.name,self.age))
obj=People('mzz',13)
if hasattr(obj,'name'):
print(getattr(obj,'name'))
else:
print('name不存在')
# mzz
if hasattr(obj,'xxx'):
print(getattr(obj,'xxx'))
else:
print('name不存在')
# name不存在
#例2:
class Ftp:
def put(self):
print('正在上传....')
def get(self):
print('正在下载....')
def interactice(self):
choice=input('>>>>').strip()
if hasattr(self,choice):
getattr(self,choice)()
else:
print('输入指令有误')
obj=Ftp()
obj.interactice()
# >>>>get
# 正在下载....
# >>>>xxxxx
# 输入指令有误
PS: 内置函数
# 1,取绝对值
print(abs(-1))
# 1
print(abs(77.7))
# 77.7
# 2,all any
# all(被循环出来的值都满足非0或者None才为True,空是特殊情况)
print(all([1,'aaa','1']))
# True
print(all([1,'aaa',None])) #all后面被循环出来的值必须都是非0,None,才是True,空是特殊情况
# False
print(all([])) # 空也是True,特殊情况
# True
# any
# 只要有一个为真,返回True,空是特殊情况
print(any([0,None,1]))
# True
print(any([])) # 空是False
# False
# 3,二进制,十进制,十六进制
# 二进制
print(bin(11))
# 0b1011
# 十进制
print(oct(11))
# 0o13
# 十六进制
print(hex(11))
# 0xb
# 4,判断布偶值,0,'',None为False
print(bool(''))
# False
print(bool('3'))
# True
# 5, callable 判断是否可以被调用
def func():
pass
class Foo:
pass
print(callable(Foo))
# True
# 6,字母与阿斯表对应,65-90代表A-Z
print(chr(65))
# A
print(ord('A'))
# 65
print(ord('Z'))
# 90
# 7,frozenset,可变类型转为不可变类型
# 集合本身是可变类型
s1={1,2,3}
s1.add(4)
print(s1)
# {1, 2, 3, 4}
# 加上frozenset,变为不可变集合
# s=frozenset({1,2,3})
# 8,四舍五入
print(round(1.5))
# 2
print(round(1.4))
# 1
# # =================》掌握
#1,zip(拉链一样,一一对应, 对应的多或少不会报错)
v1='hello'
v2=[111,222,333,444,5555,6666]
res=zip(v1,v2)
print(list(res))
# [('h', 111), ('e', 222), ('l', 333), ('l', 444), ('o', 5555)]
# 2,除以再得出余数(常用于分页)
print(divmod(10000,33))
# (303, 1) #分页的话,即304页
# 3,dir判断对象下有哪些属性
class Foo:
pass
obj=Foo()
obj.xxx=1111
print(dir(obj)) # obj.哪些属性
# ['__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__', 'xxx']
# 4,索引与值对应 enumerate
for i,v in enumerate(['a','b','c']):
print(i,v)
# 0 a
# 1 b
# 2 c
for v in enumerate(['a','b','c']):
print(v)
# (0, 'a')
# (1, 'b')
# (2, 'c')
#5,eval,执行字符串中的表达式
# b是个字符串类型
b='{"a":1}'
print(type(b))
# <class 'str'>
# 接上,字符串类型还原""里的内容即执行字符串中的表达式
res=eval('{"a":1}') # 执行字符串中的表达式
print(res,type(res))
# {'a': 1} <class 'dict'>
res1=eval('1+4') # '1+4'是字符串,加上eval,即执行1+4
print(res1)
# 5
# 6,isinstance,判断是否属于xx类型
class Foo:
pass
obj=Foo()
print(isinstance(obj,Foo)) # 判断obj是否属于Foo类
# True
# 判断[]是否属于列表
print(isinstance([],list)) # 类型判断推荐使用isinstance
# True
# 同上判断列表也可以以下方式
print(type([]) is list) # 不推荐使用
# True
#7,导导入的模块实例化
# import 'time' # 错误
t=__import__('time')
t.sleep(3)