一、反射:用字符串数据类型的变量名来访问这个变量的值

上代码^_^

  1. # class Student:
  2. # ROLE = 'STUDENT'
  3. # @classmethod
  4. # def check_course(cls):
  5. # print('查看课程了')
  6. #
  7. # @staticmethod
  8. # def login():
  9. # print('登录')
  1. # # 反射查看属性
    # # print(Student.ROLE)#普通方法
    # # print(getattr(Student,'ROLE'))
    #
    # # 反射调用方法
    # # getattr(Student,'check_course')() # 使用类中的方法
    # # getattr(Student,'login')() # 使用静态方法
  1.  

用对象来反射

  1. # class A():
  2. # def __init__(self,name):
  3. # self.name = name
  4. #
  5. # def func(self):
  6. # print('in func')
  7. #
  8. # a = A('alex')#实例化一个对象
  9. # print(a.name)
  10. # print(getattr(a,'name'))#获得属性值
  11. # getattr(a,'func')()#执行方法

是不是还挺好理解的啊!!

模块角度

好像是不是有xxx.xxx就能用到啊,模块四不四 from xxx import xxx.xxx啊,对就能用。

  1. # import os # 别人写好的python代码的结合
  2. # # os.rename('__init__.py','init')#改文件名的功能
  3. # # getattr(os,'rename')('init','__init__.py') #功能和上面一样后面是参数。
  4. # rename = os.rename
  5. # rename2 = getattr(os,'rename')
  6. # rename2('__init__.py','init') # os.rename('__init__.py','init')
  7. # rename('init','init2') # os.rename('init','init2')
  1. 下一个是 反射自己模块中的内容 找到自己当前文件所在的命名空间。这个有点不好理解,不过聪明人会先记住有机会慢慢在理解。
  1. # import sys
  2. # print(sys.modules)#查看当前模块,返回的是一个字典
  3. # import 都相当于导入了一个模块
  4. # 模块哪个导入了 哪个没导入 在我的python解释器里应该记录下来
  5. # import sys 是一个模块,这个模块里的所有的方法都是和python解释器相关的
  6. # sys.modules 这个方法 表示所有在当前这个python程序中导入的模块
  7. # '__main__': <module '__main__' from 'D:/sylar/python_workspace/day20/4.反射.py'>
  8. # print(sys.modules['__main__'])
  9. # my_file = sys.modules['__main__']#这个先记住
  10. # my_file.wahaha()
  11. # my_file.qqxing()
  12. # # 'qqxing'
  13. # # 'wahaha'
  14. # getattr(my_file,'wahaha')()
  15. # getattr(my_file,'qqxing')()

总结下

  1. # 反射
  2. # hasattr,getattr
  3. # 类名.名字
  4. # getattr(类名,'名字')
  5. # 对象名.名字
  6. # getattr(对象,'名字')
  7. # 模块名.名字
  8. # import 模块
  9. # getattr(模块,'名字')
  10. # 自己文件.名字
  11. # import sys
  12. # getattr(sys.modules['__main__'],'名字')

下面来个实际应用场景,理解后背下来自己敲一便。

  1. # class Manager:
  2. # OPERATE_DIC = [
  3. # ('创造学生账号', 'create_student'),
  4. # ('创建课程','create_course'),
  5. # ('查看学生信息','check_student_info'),
  6. # ]
  7. # def __init__(self,name):
  8. # self.name = name
  9. # def create_student(self):
  10. # print('创建学生账号')
  11. # def create_course(self):
  12. # print('创建课程')
  13. # def check_student_info(self):
  14. # print('查看学生信息')
  15. #
  16. # class Student:
  17. # OPERATE_DIC = [
  18. # ('查看所有课程', 'check_course'),
  19. # ('选择课程', 'choose_course'),
  20. # ('查看已选择的课程', 'choosed_course')
  21. # ]
  22. # def __init__(self,name):
  23. # self.name = name
  24. # def check_course(self):
  25. # print('check_course')
  26. # def choose_course(self):
  27. # print('choose_course')
  28. # def choosed_course(self):
  29. # print('查看已选择的课程')
  30. #
  31. # def login():
  32. # username = input('user : ')
  33. # password = input('pwd : ')
  34. # with open('userinfo') as f:
  35. # for line in f:
  36. # user,pwd,ident = line.strip().split('|') # ident = 'Manager'
  37. # if user == username and pwd == password:
  38. # print('登录成功')
  39. # return username,ident
  40. #
  41. # import sys
  42. # def main():
  43. # usr,id = login()
  44. # print('user,id :',usr,id)
  45. # file = sys.modules['__main__']
  46. # cls = getattr(file,id) #Manager = getattr(当前文件,'Manager'),获得对应的类
  47. # obj = cls(usr)
  48. # operate_dic = cls.OPERATE_DIC
  49. # while True:
  50. # for num,i in enumerate(operate_dic,1):
  51. # print(num,i[0])
  52. # choice = int(input('num >>>'))
  53. # choice_item = operate_dic[choice-1]
  54. # getattr(obj,choice_item[1])()
  55. #
  56. #
  57. #
  58. # main()

主要是实现登陆和特定人员的选择和更改。

二、内置方法:有些函数里面带了特定的方法,比如len()里面可能有__len__这个方法

  1. # __名字__
    # 类中的特殊方法\内置方法
    # 双下方法
    # 魔术方法 magic_method
    # 类中的每一个双下方法都有它自己的特殊意义
  2.  
  3. 1.__call__
  1. # class A:
  2. # def __call__(self, *args, **kwargs):
  3. # print('执行call方法了')
  4. # def call(self):
  5. # print('执行call方法了')
  6. # class B:
  7. # def __init__(self,cls):
  8. # print('在实例化A之前做一些事情')
  9. # self.a = cls()
  10. # self.a()
  11. # print('在实例化A之后做一些事情')
  12. # a = A()
  13. # a() # 对象() == 相当于调用__call__方法
  14. # a.call()#就调用类里面的__call__方法了
  1. # A()() # 类名()() ,相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法
    # B(A)
  1.  

2.__len__

  1. # 内置函数和类的内置方法是由奸情的
  1. # class My:
  2. # def __init__(self,s):
  3. # self.s = s
  4. # def __len__(self):
  5. # return len(self.s)
  6. # my = My('abc')
  7. # print(len(my))

3.__new__

  1. # class Single:
  2. # def __new__(cls, *args, **kwargs):
  3. # obj=object.__new__(cls)
  4. # print('在new方法里',obj)
  5. # return obj
  6. # def __init__(self):
  7. # print('在init方法里',self)
  1. #执行顺序
    #1.开辟一个空间,属于对象的
    #2.把对象的空间传给self,执行init
    #3.将这个对象的空间返回给调用者
  1. #new 方法在什么时候执行?
    #在实例化对象之后,__init__之前先执行__new__来创建一块空间
  2.  
  3. 单例类,背下来面试题
  1. class Single:
  2. __isinstance=None
  3. def __new__(cls, *args, **kwargs):
  4. if not cls.__isinstance:
  5. cls.__isinstance=object.__new__(cls)
  6. return cls.__isinstance
  7. def __init__(self,name,age):
  8. self.name=name
  9. self.age=age
  10. print( self)
  11.  
  12. a=Single('aaa',56)
  13. b=Single('sdf',55)
  14. print(a.name)

只要前面实例化一个对象,就会开辟一个内存空间。后面的实例化对象不能开辟新的内存空间,后面的对象传进去的参数会覆盖前面对象的参数。

  1.  

python day21 ——面向对像-反射 getattr,内置方法的更多相关文章

  1. python 面向对象之反射及内置方法

    面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...

  2. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  3. 面向对象(五)——isinstance与issubclass、反射、内置方法

    isinstance与issubclass.反射.内置方法 一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,cla ...

  4. Python学习day08-python进阶(2)-内置方法

    Python学习day08-python进阶(2)-内置方法 列表数据类型内置方法 作用 描述多个值,比如爱好 定义方法       xxxxxxxxxx 2         1 hobby_list ...

  5. python面向编程;类的绑定与非绑定方法、反射、内置方法

    一.类的绑定与非绑定方法 ''' 类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何 ...

  6. python面向对象 : 反射和内置方法

    一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类  (注:type(对象名) is 类名 : 判断对象所属 ...

  7. Python之路(第二十五篇) 面向对象初级:反射、内置方法

    [TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...

  8. 《Python》反射、内置方法(__str__,__repr__)

    一.反射 通过字符串的形式操作对象相关的属性.(使用字符串数据类型的变量名来获取这个变量的值) Python中的一切事物都是对象(都可以使用反射) 反射类中的变量 反射对象中的变量 反射模板中的变量 ...

  9. python 反射和内置方法

    一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) ...

随机推荐

  1. 当SQL Server的实例位于集群的特定节点时,数据库无法远程访问

    搭建好了一个集群环境,发现当SQL Server的实例位于集群的其中一个节点时,数据库无法远程访问,报如下错误.但在另一个 节点时,数据库访问正常. 标题: 连接到服务器 -------------- ...

  2. iptables 最终 第四章

    转发 ,NAT 功能 Chain FORWARD 开启网卡转发功能: /proc/sys/net/ipv4/ip_forward #使用sysctl 开启内核转发功能 sysctl - 核心转发: / ...

  3. CSS 文件引入

    CSS 文件引入 <html> <head> <!-- link标签引用其他文件.rel="stylesheet" 引用css.href=" ...

  4. Linux vim文档操作

    1.vim passwd文件 出现 发现文件passwd.swp文件,无法正常编辑vim的时候,删除掉.psswd.swp即可 vim下:dd #删除一行 vim下:p #粘贴一行 vim下:y #复 ...

  5. SpringBootsad整合EhCache做缓存处理

    轻量级的缓存框架Ehcache实现其功能.从以下几点切入: 什么是EhCache? 它和redis.membercache比较有什么优势? 和SpringBoot怎么整合? 实现机制? 有哪些坑? E ...

  6. 关于 使用python向qq好友发送消息(对爬虫的作用----当程序执行完毕或者报错无限给自己qq发送消息,直到关闭)

    以前看到网上一些小程序,在处理完事物后会自动发送qq消息,但是一直搞不懂是说明原理.也在网上找过一些python登陆qq发送消息的文字,但是都太复杂了.今天偶然看到一篇文章,是用python调用win ...

  7. JavaScript(数组、Date、正则)

    数组 创建数组 // 一.自变量创建数组 // 1-通过字面量创建一个空数组 var arr1 = []; console.log(arr1) console.log(typeof arr1); // ...

  8. webpack4入门

    前提 已安装node(版本号>4.0,已自带NPM) mac机器 有一个空目录 无webpack.config.js配置打包 快速构建package.json文件. npm init -y 安装 ...

  9. Docker:bash: vi: command not found

    在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim 操作步鄹: 1.apt-get update 2.ap ...

  10. vue extend 的基本使用

    vue.extend 局部注册 的应用2 请注意,extend创建的是一个组件构造器,而不是一个具体的组件实例.所以他不能直接在new Vue中这样使用: new Vue({components: f ...