反射(内置函数补充)

一,反射

# 什么是反射?
# 指的是在程序运行过程中可以"动态(不见棺材不掉泪)"获取对象的信息
# 动态:是指在定一个一个函数时比如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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容