python入行033(反射)
1 反射
python是动态语言,反射指的是在程序运行过程中可以“动态”的获取对象的属性。
可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式;再使用内置的四个函数就可以通过字符串来操作对象属性了。
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(‘辣白菜同学‘, 18) print(obj.name) print(obj.__dict__[dir(obj)[-2]]) >>> 辣白菜同学 >>> 辣白菜同学
四个内置函数的使用:
print(hasattr(obj, ‘say‘)) >>> True print(getattr(obj, ‘name‘)) >>> 辣白菜同学 setattr(obj, ‘name‘, ‘土豆同学‘) print(obj.__dict__) >>> {‘name‘: ‘土豆同学‘, ‘age‘: 18} delattr(obj, ‘name‘) print(obj.__dict__) >>> {‘age‘: 18}
2 内置方法
2.1 什么是内置方法
定义在类内部,以__开头并以__结尾的方法;会在某种情况下自动触发执行。
class People: def __init__(self, name, age): self.name = name self.age = age obj = People(‘辣白菜同学‘, 18) # 调用类的时候自动执行__init__方法,初始化对象属性 print(People.__init__) >>> <function People.__init__ at 0x000002B2E7E1CD08>
2.2 为何要用内置方法
为了定制化我们的类or对象。
2.3 如何使用内置方法
(1)__str__() 在打印对象时会自动触发,然后将返回值(必须是字符串类型)当做本次打印的结果输出
class People: def __init__(self, name): self.name = name def __str__(self): return "%s" %(self.name)obj = People(‘辣白菜同学‘)print(obj)>>> ‘辣白菜同学‘
# python中一切皆对象,这也就解释了为什么我们在调用str类实例化对象时,打印对象能够直接打印出对象的属性值 obj = str(‘mrz‘) print(obj) >>> ‘mrz‘
(2)__del__()
# __del__:在清理对象时触发,会先执行该方法 class People: def __init__(self, name, age): self.name = name self.age = age # self.x = open(‘a.txt‘,mode=‘w‘) # self.x = 占据的是操作系统资源 def __del__(self): print(‘run...‘) # 发起系统调用,告诉操作系统回收相关的系统资源 # self.x.close() # obj = People(‘辣白菜同学‘, 18) del obj # obj.__del__() print(‘============>‘)>>> run...>>> ============>
相关推荐
pythonxuexi 2020-07-19
ciqingloveless 2020-06-19
guangmingsky 2020-06-01
bizercsdn 2020-05-10
小方哥哥 2020-05-10
flowerCSDN 2020-04-21
txlCandy 2020-04-20
Airuio 2020-02-20
猛禽的编程艺术 2020-02-02
laityc 2020-01-01
jacktangj 2020-01-07
zhglinux 2019-12-25
jacktangj 2019-12-15
pythonxuexi 2019-11-30
heideyanmou 2019-03-21
sharkandshark 2012-03-20
orlandowww 2019-06-26
Lenskit 2019-06-27