zoukankan      html  css  js  c++  java
  • 面向对象之反射 与__str__等内置函数

    一  反射

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

      四个可以实现自省<反射>的函数: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输入的时候是字符串形式,为了便于获取相关属性就产生了反射的概念,具体请研究上面的代码栏。

    二  __str__的用法

      改变对象的字符串显示

    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__的用法

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

      注:此方法一般无须定义,因为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
  • 相关阅读:
    UC将发布高性能HTML5游戏引擎XCanvas
    一台晚会3.15拯救不了这些高科技公司
    4G时代更有利于TDD的发展
    【leetcode】Binary Tree Zigzag Level Order Traversal
    四月电商价格战火重燃 服务为决胜之道
    linux sysfs(3)
    ubuntu gedit 中文显示乱码解决方法
    研究人员将Windows Phone 7和Windows Azure推广到平流层的大气污染研究中
    迁移周系列II/II: On Premises 迁移视频
    玩Rock, Paper, Azure Challenge,赢取免费Kinect和Xbox 360!
  • 原文地址:https://www.cnblogs.com/junxiansheng/p/7132723.html
Copyright © 2011-2022 走看看