一、反射

   通过字符串的形式操作对象相关的属性。(使用字符串数据类型的变量名来获取这个变量的值)

    Python中的一切事物都是对象(都可以使用反射)

      反射类中的变量

      反射对象中的变量

      反射模板中的变量

      反射本文件中的变量

    用反射的场景:

      input

      网络

      文件

  1. #hasattr
  2.  
  3. def hasattr(*args, **kwargs): # real signature unknown
  4. """
  5. Return whether the object has an attribute with the given name.
  6.  
  7. This is done by calling getattr(obj, name) and catching AttributeError.
  8. """
  9. pass
  10.  
  11. #getattr
  12.  
  13. def getattr(object, name, default=None): # known special case of getattr
  14. """
  15. getattr(object, name[, default]) -> value
  16.  
  17. Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
  18. When a default argument is given, it is returned when the attribute doesn't
  19. exist; without it, an exception is raised in that case.
  20. """
  21. pass
  22.  
  23. #setattr
  24.  
  25. def setattr(x, y, v): # real signature unknown; restored from __doc__
  26. """
  27. Sets the named attribute on the given object to the specified value.
  28.  
  29. setattr(x, 'y', v) is equivalent to ``x.y = v''
  30. """
  31. pass
  32.  
  33. #delattr
  34.  
  35. def delattr(x, y): # real signature unknown; restored from __doc__
  36. """
  37. Deletes the named attribute from the given object.
  38.  
  39. delattr(x, 'y') is equivalent to ``del x.y''
  40. """
  41. pass

反射的4种方法源码

  

  1、getattr()

    getattr(变量名:命名空间,字符串:属于一个命名空间内的变量名)

      类名.静态属性  getattr(类名,‘静态属性’)

      类名.类方法()   getattr(类名,‘类方法’)()

      类名.静态方法()  getattr(类名,‘静态方法’)()

      

      对象.对象属性  getattr(对象,‘对象属性’)

      对象.方法()    getattr(对象,‘方法’)()

      模块名.方法名

      模块名.类名

      模块名.变量

      模块名.函数

      本文件反射  import sys

      getattr(sys.modules[__name__],'所有定义在这个文件中的名字')

  1. # 反射类中的变量: 静态属性、类方法、静态方法
  2. class Foo:
  3. school = 'oldboy'
  4. country = 'china'
  5. language = 'chiness'
  6.  
  7. @classmethod     # 类方法
  8. def class_method(cls):
  9. print(cls.school)
  10.  
  11. @staticmethod    # 静态方法
  12. def static_method():
  13. print('in staticmethod')
  14.  
  15. def wahaha(self):  # 普通方法
  16. print('wahaha')
  17.  
  18. print(Foo.school) # oldboy
  19. print(Foo.country) # china
  20. print(Foo.language) # chiness
  21.  
  22. # 判断实现
  23. inp = input('>>>')
  24. if inp == 'school': print(Foo.school) # oldboy
  25. elif inp == 'country': print(Foo.country) # china
  26. elif inp == 'language': print(Foo.language) # chiness
  27.  
  28. # 反射实现
  29. while 1:
  30. inp = input('>>>') # 输school,打印oldboy 输country,打印china 输language,打印chiness
  31. print(getattr(Foo,inp))
  32.  
  33. # 解析getattr方法
  34. print(getattr(Foo,'school')) # oldboy
  35. Foo.class_method() # oldboy
  36. print(getattr(Foo,'class_method')) # <bound method Foo.class_method of <class '__main__.Foo'>>
  37. getattr(Foo,'class_method')() # oldboy 相当于:Foo.class_method()
  38. getattr(Foo,'static_method')() # in staticmethod 相当与:Foo.static_method()

   

  1. # 反射对象中的变量
  2.  
  3. class Foo:
  4. def __init__(self,name,age):
  5. self.name = name
  6. self.age = age
  7. def eating(self):
  8. print('%s is eating' % self.name)
  9. alex = Foo('alex',38)
  10. print(getattr(alex,'name')) # alex  反射对象属性
  11. print(getattr(alex,'age')) # 38  
  12. getattr(alex,'eating')() # alex is eating  反射对象方法
  1. # 反射模块中的变量
  2. import os # os就是一个模块
  3. os.rename('D:\\python_task1.py','D:\\python_task2.py')
  4. getattr(os,'rename') # 把python_task1.py改成了python_task2.py
  5. getattr(os,'D:\\python_task1.py','D:\\python_task2.py') # 效果同上
  1. # 反射本文件中的变量
  2.  
  3. a = 1
  4. b = 2
  5. name = 'alex'
  6.  
  7. def qqxing():
  8. print('like eat qqxing')
  9.  
  10. class Foo:
  11. pass
  12.  
  13. import sys
  14.  
  15. print(sys.modules['__main__']) # 本文件的命名空间
  16. print(sys.modules['__main__'].a) #
  17. print([__name__]) # ['__main__']
  18.  
  19. print(sys.modules[__name__]) # 反射本文件中的变量 固定的使用这个命名空间
  20. print(getattr(sys.modules[__name__],'a')) #
  21. print(getattr(sys.modules[__name__],'b')) #
  22. print(getattr(sys.modules[__name__],'name')) # alex
  23. getattr(sys.modules[__name__],'qqxing')() # like eat qqxing
  24. print(getattr(sys.modules[__name__],'Foo')) # <class '__main__.Foo'> Foo类的地址
  25. print(getattr(sys.modules[__name__],'Foo')()) # <__main__.Foo object at 0x0072BED0> Foo类对象的地址

  2、hasattr()

    hasattr(变量名:命名空间,字符串:属于一个命名空间内的变量名)  成立返回Ture,不成立返回False,一般与getattr搭配使用

  1. class Foo:
  2. school = 'oldboy'
  3. country = 'china'
  4. language = 'chiness'
  5.  
  6. @classmethod
  7. def class_method(cls):
  8. print(cls.school)
  9.  
  10. @staticmethod
  11. def static_method():
  12. print('in staticmethod')
  13.  
  14. def wahaha(self):
  15. print('wahaha')
  16.  
  17. inp = input('>>>') # 输入 haha
  18. print(getattr(Foo, inp))
  19. # 如果输入的不存在则报错
  20. # AttributeError: type object 'Foo' has no attribute 'haha'
  21. # 所以要给他定义一个判断条件
  22.  
  23. inp = input('>>>')
  24. if hasattr(Foo,inp): # 如果输入的字符串在这个类中,则成立
  25. print(getattr(Foo,inp))

  3、setattr()

    setattr(名称空间,变量名,变量值)  更改变量的值

      给命名空间的某一个名字设置一个值

  1. # setattr:接受三个参数 命名空间 ‘变量名’ 变量值
  2. class Foo:
  3. school = 'oldboy'
  4.  
  5. def func():
  6. print('wahaha')
  7.  
  8. Foo.school = 'OLDBOY' # 直接更改
  9. print(Foo.school) # OLDBOY
  10. setattr(Foo,'school','OLDOBY') # 有school这个属性则更改
  11. print(Foo.school) # OLDBOY
  12. print(getattr(Foo,'school'))
  13. setattr(Foo,'name','alex') # 没有name这个属性则添加
  14. print(Foo.name) # alex
  15. print(Foo.__dict__)
  16.  
  17. setattr(Foo,'func',func) # 往类中添加方法,不过一般没人这么做
  18. Foo.func() #wahaha
  19. func() #wahaha
  20. print(Foo.__dict__)
  21. '''
  22. {'__module__': '__main__', 'Country': 'China', '__dict__': <attribute '__dict__' of 'Foo' objects>,
    '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None, 'func': <function func at 0x00788D68>}
  23. '''

  4、delattr()

    delattr(命名空间,变量)

      删除某一个命名空间中变量对应的值

  1. class Foo:
  2. school = 'oldboy'
  3. country = 'china'
  4. language = 'chiness'
  5.  
  6. def wahaha(self):
  7. print('wahaha')
  8.  
  9. def qqxing(self):
  10. print('qqxing')
  11.  
  12. del Foo.country # 直接删除一个属性
  13. print(Foo.__dict__)
  14. delattr(Foo,'school') # 使用delattr删除一个属性
  15. print(Foo.__dict__)
  16. del Foo.wahaha # 直接删除一个方法
  17. print(Foo.__dict__)
  18. delattr(Foo,'qqxing') # 使用delattr删除一个方法
  19. print(Foo.__dict__)

二、内置方法

    在不是需要程序员定义,本身就存在在类中的方法就是内置方法

    内置的方法通常都长这样:__名字__

    各种不同叫法:名字+(双下方法、魔术方法、内置方法)

    所有的双下方法,都不需要我们直接去调用,都有另外一种自动触发它的语法

   __init__:

    不需要我们主动调用,而是在实例化的时候内部自动调用的

   __str__ 和 __repr__:  

    这俩方法的返回值必须是字符串,否则抛出异常。  

  1.    __str__:
        当你打印一个对象的时候 触发__str__
        当你使用%s格式化的时候 触发__str__
        str强转数据类型的时候 触发__str__
  2.  
  3.    __repr__:
        reprstr的备胎
        __str__的时候执行__str__,没有实现__str__的时候,执行__repr__
        repr(obj)内置函数对应的结果是 __repr__的返回值
        当你使用%r格式化的时候 触发__repr__
  1. class Course:
  2.  
  3. def __init__(self,name,period,price,teacher):
  4. self.name = name
  5. self.period = period
  6. self.price = price
  7. self.teacher = teacher
  8.  
  9. def __repr__(self):
  10. return 'repr : %s %s %s %s ' % (self.name,self.period,self.price,self.teacher)
  11.  
  12. def __str__(self):
  13. return 'str : %s %s %s %s ' % (self.name, self.period, self.price, self.teacher)
  14.  
  15. course_lst = []
  16. python = Course('python','6 month',29800,'alex')
  17. course_lst.append(python)
  18. linux = Course('linux','5 month',19800,'oldboy')
  19. course_lst.append(linux)
  20. for id,course in enumerate(course_lst,1):
  21. print(id,course) # 1 str : python 6 month 29800 alex
  22. # 2 str : linux 5 month 19800 oldboy
  23.  
  24. print('%s %s' % (id,course)) # 效果同上
  25.  
  26. print(str(course)) # str : python 6 month 29800 alex
  27. # str : linux 5 month 19800 oldboy
  28.  
  29. print(repr(course)) # repr : python 6 month 29800 alex
  30. # repr : linux 5 month 19800 oldboy
  31.  
  32. print('%r' % course) # 效果同上
  33.  
  34. # __str__
  35. # 当你打印一个对象的时候 触发__str__
  36. # 当你使用%s格式化的时候 触发__str__
  37. # str强转数据类型的时候 触发__str__
  38.  
  39. # __repr__
  40. # repr是str的备胎
  41. # 有__str__的时候执行__str__,没有实现__str__的时候,执行__repr__
  42. # repr(obj)内置函数对应的结果是 __repr__的返回值
  43. # 当你使用%r格式化的时候 触发__repr__

    

  1. #子类与父类的__str__和__repr__触发顺序:
  2.  
  3. class Foo:
  4. def __str__(self):
  5. return 'Foo.str'
  6. def __repr__(self):
  7. return 'Foo.repr'
  8.  
  9. class Son(Foo):
  10. def __str__(self):
  11. return 'Son.str'
  12. def __repr__(self):
  13. return 'Son.str'
  14.  
  15. obj = Son()
  16. print(obj)
  17. '''
  18. 当打印子类的对象时:
  19. 1、先从子类找__str__
  20. 2、子类中没有__str__,则到父类找__str__
  21. 3、子类和父类都没有__str__,则找子类的__repr__
  22. 4、子类和父类都没有__str__,且子类没有__repr__,则找父类的__repr__
  23. '''

    

    

《Python》反射、内置方法(__str__,__repr__)的更多相关文章

  1. 内置方法 __str__ __repr__

    内置方法(双下方法,魔术方法) 在不需要程序员定义,本身就存在的类中的方法就是内置方法 内置方法:  __名字__ __init__   不需要我们主动调用,而是在实例化的时候内部自动调用的,存在一种 ...

  2. 第8.14节 Python类中内置方法__str__详解

    一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...

  3. python 字典内置方法get应用

    python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...

  4. Python的内置方法,abs,all,any,basestring,bin,bool,bytearray,callable,chr,cmp,complex,divmod

    Python的内置方法 abs(X):返回一个数的绝对值,X可以是一个整数,长整型,或者浮点数,如果X是一个复数,此方法返回此复数的绝对值(此复数与它的共轭复数的乘积的平方根) >>> ...

  5. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  6. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  7. 6.python字符串-内置方法列举

    所谓内置方法,就是凡是字符串都能用的方法,这个方法在创建字符串的类中,下面是总结: 首先,我们要学习一个获取帮助的内置函数 help(对象) ,对象可以是一个我们创建出来的,也可以是创建对象的那个类, ...

  8. python字符串内置方法

    网上已经有很多,自己操作一遍,加深印象. dir dir会返回一个内置方法与属性列表,用字符串'a,b,cdefg'测试一下 dir('a,b,cdefg') 得到一个列表 ['__add__', ' ...

  9. Python的内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  10. python黑魔法 -- 内置方法使用

    很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法. __getitem__ __setitem__ __delitem__ 这三个方法是字典类的内置方法,分别对应 ...

随机推荐

  1. 终于在nowcoder爆发了的懒惰

    题目 这类题目我实在忍不了了 Emma,随便做个nowcode比赛题吧,我在oj上也没找到 题意 求\(\sum_{L=1}^{n}\sum_{R=i}^{n}a[k](L<=k<=R)\ ...

  2. JavaScript 开闭原则OCP

    代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...

  3. datagridview控件的使用

    http://home.cnblogs.com/group/topic/40730.html datagridview定位到最后一行的方法 this.dataGridView2.CurrentCell ...

  4. 每个成长者,必须学会可以练习 (来自ProcessOn流程图工具作者底部)

  5. shiro(1) 介绍

    一.什么是shiro (1)属性:java框架 (2)用途:身份验证.用户授权.加密.会话管理 (3)优点:轻量.易用 二.三大组件 (1)subject:代表当前主体,与当前应用交互的任何东西都是s ...

  6. UVa 1343 旋转游戏(dfs+IDA*)

    https://vjudge.net/problem/UVA-1343 题意:如图所示,一共有8个1,8个2和8个3,如何以最少的移动来使得中间8个格子都为同一个数. 思路:状态空间搜索问题. 用ID ...

  7. hdu 5524 Subtrees dfs

    Subtrees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Probl ...

  8. shell until 循环

    until 循环 格式: until condition do command done #输出0-9   #!/bin/bash a=0 until [ ! $a -lt 10 ] do echo ...

  9. Jmeter 处理Unicode编码转为中文

    对于接口中返回报文,有的接口返回信息是Unicode编码,写断言的时候,要么就Response Assertion就写成Unicode编码的断言,如下图: 真心不觉得返回报文加密能有多安全,别人将报文 ...

  10. 微信小程序获取用户手机号

    获取微信用户绑定的手机号,需先调用wx.login接口. 小程序获取code. 后台得到session_key,openid. 组件触发getPhoneNumber 因为需要用户主动触发才能发起获取手 ...