面向对象之反射 与__str__等内置函数

一  反射
python

  1.面向对象中的反射:经过字符串的形式操做对象的相关属性,python中一切事物都是属性(均可以使用反射)mysql

  四个能够实现自省<反射>的函数:hasattr /  getattr  / setattr  /delattr.程序员

class Teacher:
    school='oldboy'
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def teach(self):
        print('%s teach'%self.name)

print(Teacher.school)   ##查看类的数据属性
print(Teacher.__dict__)     ##查看类的名称空间
print(Teacher.__dict__['school'])      #根据名称空间的KEY找到对应的值

print(hasattr(Teacher,'school'))      #判断是是否有school属性
print(getattr(Teacher,'school'))      #获取类的属性值
print(getattr(Teacher,'schoolle',None))  #获取school的返回值,若是没有可设置返回值

Teacher.x=123456
setattr(Teacher,'x',123)              #修改属性
print(Teacher.x)

delattr(Teacher,'school')             #删除属性
print(Teacher.school)
setattr(Teacher,'school','偶的博爱')
print(Teacher.school)

##对象一样能够利用反射,经过字符串的形式操做相关属性
t=Teacher('egon',18)
print(hasattr(t,'name'))
print(getattr(t,'name'))
print(setattr(t,'sex','male'))
print(getattr(t,'sex'))
View Code

  在建立类的时候,会产生名称空间,存放着各个属性的名称与值得绑定关系,并且以字典的形式进行存放,因此语法上用比较贴切的__dict__即可查看.若是咱们想取值的话,能够用Teacher.school来得到属性,但同时咱们能够利用__dict__中的key来取值,即Teacher.__dict__['school'].注意里面是字符串的形式.而因为咱们用户input输入的时候是字符串形式,为了便于获取相关属性就产生了反射的概念,具体请研究上面的代码栏。sql

 

二  __str__的用法ide

  改变对象的字符串显示函数

class Teacher:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.courses=[]

    def teach(self):
        print('%s teach'%self.name)

    def __str__(self):          ##改变对象的字符串形式
        return '<name: %s age:%s>'%(self.name,self.age)
        ##返回值必须是字符串,不然会抛出异常


egon=Teacher('egon',18)
print(egon)  #print(egon.__str__())
View Code

 

三   __del__的用法spa

  当对象在内存中被释放时,自动触发执行。code

  注:此方法通常无须定义,由于Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,由于此工做都是交给Python解释器来执行,因此,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。对象

import time
class Foo:
    def __init__(self,x):
        self.x=x
        print('connect mysql')

    def __del__(self):
        '''作一些与这个对象有关的清理操做'''
        print('good')

f=Foo(10)
print(f.x)

=========结果======
connect mysql
10 
good   ----->由此能够当对象在内存中被释放时,自动触发执行
View Code
相关文章
相关标签/搜索