一.今日主要内容

  1. 1.isinstance,type,issubclass
    A.isinstance: 判断你给对象是否是xx类型的. (向上判断)
    B.type: 返回xxx对象的数据类型
    C.issubclass: 判断xxx类是否xxx的子类
  2.  
  3. (1)day11介绍过是否是可迭代的和是否是迭代器
    (2)issubclass( 判断类是否为某类的子类//查看某一个类是否为另一个类的派生类 )
    (3)isinstance (对象;判断类型)
    (4)type:类型
  4.  
  5. 2.如何区分方法和函数(代码)
    在类中:
    实例方法:
    如果是类名.方法 函数
    如果是对象.方法 方法
    类方法:都是方法
    静态方法:都是函数
  6.  
  7. from types import MethodType, FunctionType
    isinstance()
  8.  
  9. 3.反射(重要)
    一共就4个函数(在,每一道例题中,体会,到底是怎么用的)
      高手和水平差一点的人,就在于经验的掌控,这就要平时多留意生活的细节,生活会眷顾有心人,多次揣摩必有所得
    attr:attrbute属性
    getattr()
    xxx对象中获取到xxx属性值
    hasattr()
    判断xxx对象中是否有xxx属性值
    delattr()
    xxx对象中删除xxx属性
    setattr()
    设置xxx对象中的xxx属性为xxx

二.今日内容大纲

1.isinstance&type&issubclass

2.区分方法和函数

3.反射

三.今日内容详解:

1.isinstance&type&issubclass

2.区分方法和函数

3.反射

作业:

(1)类变量和示例变量的区别?

  1. 答案:类变量是属于类的
  2. 示例变量是属于实例变量的,示例变量是属于对象的

(3)isinstance和type的区别并用代码举例说明?

  1. isinstance: 判断xxx是否是xxx类型的(向上判断)
  2. type 返回xx对象的数据类型
  3. '''
  4. #自己总结
  5. (1)注意两者的写法是有区别的
  6.  
  7. (2)A:type()不会认为子类是一种父类类型,不考虑继承关系
  8. B:isinstance() 会认为子类是一种父类类型,考虑继承关系
  9.  
  10. 示例:
  11. class Animal:
  12. def eat(self):
  13. print('刚睡醒吃点儿东西')
  14. class Cat(Animal):
  15. def play(self):
  16. print('猫喜欢玩儿')
  17. c=Cat()
  18. print(isinstance(c,Cat)) # True c是一只猫
  19. print(isinstance(c,Animal)) # True
  20.  
  21. print(type(c)==Cat)
  22. print(type(c)==Animal)
  23. print(type(c)) #<class '__main__.Cat'>
  24. '''

(4)

  1. 这个题目需要认真反复研究
    题目:补全代码
    def func(arg):
    """  
    判断arg是否可以被调用,如果可以则执行并打印其返回值,
    否则直接打印结果      
    :param arg:传入的参数
    arg:      
    """
    pass
  1. def func(arg):
  2. if callable(arg): #判断xxx是否可以被调用 ()
  3. print(arg())
  4. else:
  5. print('不可以被调用')
  6. # func(1) #结果执行1() 不可以被调用
  7.  
  8. def haha():
  9. print('呵呵')
  10. return '吼吼'
  11. func(haha)
  12.  
  13. #最后执行的是 :打印'呵呵',因为打印了arg(),所有结果就有了两个.
  14. # 结果:
  15. # 呵呵
  16. # 吼吼
  17.  
  18. 思考问题:
  19. 对象可不可以被调用?只要类中有__call__,对象就是可以被调用的

(5)

  1. 补全代码(重点题目)
    def func(*args):
    """      
    计算args中函数\方法\ Foo类对象的个数,并返回给调用者      
    :param args:传入的参数       
    """
    pass
  1. from types import FunctionType,MethodType
  2. class Foo:
  3. def chi(self):
  4. print('我是吃')
  5. @staticmethod
  6. def he():
  7. print('我是he')
  8.  
  9. def func(*args): #*args可能包含:方法,函数,Foo类对象
  10. hanshu=0
  11. fangfa=0
  12. foo=0
  13. for el in args: #循环完成之后打印
  14. if isinstance(el,FunctionType): #函数
  15. hanshu+=1
  16. elif isinstance(el,MethodType): #方法
  17. fangfa+=1
  18. elif type(el)==Foo:
  19. foo+=1
  20. print(hanshu,fangfa,foo)
  21. f1=Foo()
  22. f2=Foo()
  23. func(f1,f1,f1,f2,f2,f2,f1.chi,f1.he,Foo.chi,Foo.he)
  24. #6个对象,1个方法,3个函数
  25.  
  26. print(Foo) #打印类名
  27. f=Foo()
  28. print(type(f)) #type打印的类
  1. '''
    结果:
    3 1 6
    <class '__main__.Foo'>
    <class '__main__.Foo'>
    '''
    !!!!!!type拿到的就是类!!!!!!
    有些东西真的是需要重复记忆的

(6)

  1. class StarkConfig(object):
  2. list_display=[] #类变量是共享出去的
  3. def get_list_display(self):
  4. self.list_display.insert(0,33)
  5. return self.list_display
  6. class RoleConfig(StarkConfig):
  7. list_display=[11,22]
  8.  
  9. s1=StarkConfig()
  10. s2=StarkConfig()
  11.  
  12. result1=s1.get_list_display()
  13. print(result1)
  14. result2=s2.get_list_display()
  15. print(result2)
  16.  
  17. print(result1 is result2)
  18. print(s1.list_display)
  19. '''
  20. 结果:
  21. [33]
  22. [33, 33]
  23. True
  24. [33, 33]
  25. '''
  26. #最后的result1和result2的内存地址是一样的,所以显示True
  27. #要想自己创建自己的

(7)

  1. class StarkConfig(object):
  2. list_display=[]
  3. def get_list_display(self):
  4. self.list_display.insert(0,33)
  5. return self.list_display
  6. class RoleConfig(StarkConfig):
  7. list_display = [11,22]
  8. s1=StarkConfig()
  9. s2=RoleConfig()
  10. result1=s1.get_list_display()
  11. print(result1)
  12. result2=s2.get_list_display()
  13. print(result2)
  14. #看下内存地址
  15. print(result1 is result2)
  16. print(id(result1))
  17. print(id(result2))
  18.  
  19. 结果:
  20. [33]
  21. [33, 11, 22]
  22. False
  23. 1762754727304
  24. 1762754727688

(8)

  1. class StarkConfig(object):
  2. list_display=[]
  3. def get_list_display(self):
  4. self.list_display.insert(0,33)
  5. return self.list_display
  6. class RoleConfig(StarkConfig):
  7. list_display=[11,22]
  8. s1=RoleConfig()
  9. s2=RoleConfig()
  10. result1=s1.get_list_display()
  11. print(result1)
  12. result2=s2.get_list_display()
  13. print(result2)
  14.  
  15. 结果:
  16. 分析同第六题的继承
  17. #用的是同一份类变量
  18. 结果:
  19. [33, 11, 22]
  20. [33, 33, 11, 22]

(9)

  1. class Base(object):
  2. pass
  3. class Foo(Base):
  4. pass
  5. print(issubclass(Base,Foo)) #结果:False

(11)#重点题目,这是一道综合的大题(有必要,反复看,手写多遍)

  1. #要求:
    如果有以下handler.py文件,请run.py中补充代码实现:
    获取handler中所有成员名称:dir(handler)
    获取handler中名字叫Base的成员
    检查其他成员是否是Base类的子类(不包含Base),如果是则创建对象并添加到objs列表中
  1. # #原例
  2. # handler.py文件内的内容
  3. class Base(object):
  4. pass
  5. class F1(Base):
  6. pass
  7. class F2(Base):
  8. pass
  9. class F3(F2):
  10. pass
  11. class F4(Base):
  12. pass
  13. class F5(object):
  14. pass
  15. class F6(F5):
  16. # pass
  17.  
  18. #run,py
  19. import handler
  20. def func():
  21. objs=[]
  22. name_list=dir(handler) #简介:查看xx对象中的所有的内容,迭代器中用过
  23. print(name_list)
  24. if __name__== '__main__':
  25. func()
  26.  
  27. #自己测试的程序
  28. import handler
  29. def func():
  30. objs=[]
  31. name_list=dir(handler) #简介:查看xx对象中的所有的内容,迭代器中用过
  32. print(name_list)
  33. # print(dir(handler)) #整合,上边的两行
  34. if __name__== '__main__':
  35. func()
  36.  
  37. # 理解的知识点
  38. # print(help(dir()))
  39. #builtins 内置函数
  40.  
  41. #老师讲解:#(重点题目,需要反复理解issubclass,type,isinstance)
  42. import handler
  43. def func():
  44. objs=[]
  45. name_list=dir(handler) #简介:查看xx对象中的所有的内容,迭代器中用过
  46. print(name_list)
  47. '''
  48. #结果是:
  49. ['Base', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', '__builtins__', '__cached__',
  50. '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
  51. '''
  52. base=getattr(handler,'Base') #拿到Base类
  53. print(base)
  54. '''
  55. #结果是:
  56. <class 'handler.Base'>
  57. '''
  58. for el in name_list: #从模块中的所有的名字中拿到每一个名字
  59. if not el.startswith('__')and issubclass(getattr(handler,el),base)and el!='Base':
  60. #不是父类本身;不是以__开头的;是base的子类,通过得到每一个类名;三个条件的交集
  61. #双下划线开头和结束的是模块
  62. #getattr(handler,el)得到模块里边的类名
  63. objs.append(getattr(handler,el)()) #因为要放的是对象,所以要加上括号
  64. print(objs)
  65.  
  66. # print(name_list)
  67. # print(dir(handler)) #整合
  68. if __name__== '__main__':
  69. func()
  70.  
  71. '''
  72. getattr():从xxx对象中获取到xxx属性值
  73. 本题是:getattr(handler,el)得到模块里边的类名
  74. '''

(12)

  1. #没有思路,老师当时漏掉的小知识点
  2. class Foo(object):
  3. def __init__(self):
  4. self.name = ' '
  5. self.age=100
  6. obj=Foo()
  7. setattr(obj,'email','wupeiqi@xx.com')
  8. # #请实现:一行代码实现获取obj中所有成员(字典类型)
  9. #
  10. # #老师讲解:
  11. # # 如何拿到对象中所有的成员
  12. print(obj.__dict__) #一句话拿到一个字典
  13. # # 结果:{'name': ' ', 'age': 100, 'email': 'wupeiqi@xx.com'}

(13)

  1. class Foo(object):
  2. def __init__(self):
  3. self.name=' '
  4. self.age=100
  5. obj=Foo()
  6. setattr(Foo,'email','wupeiqi@xx.com')
  7. #必须在Foo中加上这个信息,在对象中加会产生
  8. # type object 'Foo' has no attribute 'email'
  9. v1=getattr(obj,'email')
  10. v2=getattr(Foo,'email')
  11. print(v1,v2) #类和对象都有
  12. '''
  13. wupeiqi@xx.com wupeiqi@xx.com
  14. '''
  15. #总结:从类和对象都可以拿到属性

(14)什么是可迭代对象?如何将一个对象变成可迭代对象?

  1. # A.
  2. class Foo: #类是不可迭代的
  3. pass #'Foo' object is not iterable
  4. f=Foo()
  5. for e in f:
  6. print(e)
  7.  
  8. #B. 将类变成可迭代的
  9. class Foo:
  10. def __iter__(self):
  11. return (i for i in range(10)) #生成器表达式
  12. f=Foo()
  13. for e in f:
  14. print(e)
  15. '''
  16. 结果:
  17. 0
  18. 1
  19. 2
  20. 3
  21. 4
  22. 5
  23. 6
  24. 7
  25. 8
  26. 9
  27. '''

(15)

  1. 15.如何让一个对象可以被执行?
  2. 在类中添加 __call__

巨蟒python全栈开发-第19天 核能来袭-反射的更多相关文章

  1. 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理

    一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...

  2. 巨蟒python全栈开发-第16天 核能来袭-初识面向对象

    一.今日内容总览(上帝视角,大象自己进冰箱,控制时机) #转换思想(从面向过程到面向对象) 1.初识面向对象 面向过程: 一切以事物的发展流程为中心. 面向对象: 一切以对象为中心,一切皆为对象,具体 ...

  3. 巨蟒python全栈开发-第17天 核能来袭-成员

    一.今日主要内容 1.成员 在类中你能写的所有内容都是类的成员 2.变量 (1)实例变量:昨天写的就是实例变量,由对象去访问的变量. (2)类变量(静态变量):此时,这个变量属于类,但是对象也可以访问 ...

  4. 巨蟒python全栈开发-第18天 核能来袭-类和类之间的关系

    一.今日主要内容: 1.类与类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中,类和类之间也可以产生相关的关系 (1)依赖关系 执行某个动作(方法)的时候,需要xxx来帮助你完成 ...

  5. 巨蟒python全栈开发linux之centos3

    1.作业讲解 (1)递归创建文件夹/tmp/oldboy/python/{alex,wusir,nvshen,xiaofeng} 下面中的路径没有必要换,在哪里创建都行,根目录下或者tmp目录下或者其 ...

  6. 巨蟒python全栈开发linux之centos1

    1.linux服务器介绍 2.linux介绍 3.linux命令学习 linux默认有一个超级用户root,就是linux的皇帝 注意:我的用户名是s18,密码是centos 我们输入密码,点击解锁( ...

  7. 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解

    1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...

  8. 巨蟒python全栈开发flask9 项目开始1

    1.项目需求分析 立项:Javis&&taisen(三个月全部,先模拟出一个玩具,硬件需要周期长一些) 想法 --- 需求分析: .通过玩具与孩子实时进行沟通 .希望玩具的知识渊博 . ...

  9. 巨蟒python全栈开发linux之centos6

    1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...

随机推荐

  1. C语言之文件操作08——总结

    C程序的文件操作共涵盖7个例题,包括格式打印,文件读取,条件查找,矩阵的文件操作,数据格式输入及调用计算等内容. 文件操作使得程序有更强的拓展性,使其能够单独保存数据.这为程序的调试和优化打下了坚实的 ...

  2. 实现Windows Server 2003多用户远程登录(转载)

    Windows Server 2003默认情况下允许远程终端连接的数量是2个用户,我们可以根据需要适当增加远程连接同时在线的用户数. 单击“开始→运行”,输入“gpedit.msc”打开组策略编辑器窗 ...

  3. python学习之io模块

    class io.BytesIO([initial_bytes]) 他是一个_io.BytesIO对象. 用这个类的实例可以操作内存缓冲区中的字节流. >>> s = 'hello' ...

  4. layui进度条bug

    对于动态及生成的进度条,在渲染时候要使用element.init();element.init();element.progress('demo', percent+'%');

  5. jdbc preparedstatement 调用存储过程的问题

    preparedstatement   是可以执行正常的存储过程 executeQuery() 正常执行 在实际开发中遇到一种问题当 preparedstatement.setMaxRows 设置了这 ...

  6. 【问题记录】shiro logout UnknownSessionException

    问题描述:web项目中使用shiro做登录权限控制,当shiro执行logout后,直接返回一个jsp路径会抛出org.apache.shiro.session.UnknownSessionExcep ...

  7. target="_blank" 导致的钓鱼攻击

    挺久的漏洞,之前没仔细看现在看了下 直接构建实验环境: test1.html: <!DOCTYPE html> <html> <head> <meta cha ...

  8. linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置

    如果ping域名的时候出现ping:unknown host  xxx.xxx 但是ping IP地址的时候可以通的话 可知是dns服务器没有配置好, 查看一下配置文件/etc/resolv.conf ...

  9. GCD 莫比乌斯反演 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对.

    /** 题目:GCD 链接:https://vjudge.net/contest/178455#problem/E 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对( ...

  10. [转]Tomcat和Apache的区别和联系

    Apache,指的是Apache软件基金会下的一个项目——Apache HTTP Server Project:Nginx同样也是一款开源的HTTP服务器软件(当然它也可以作为邮件代理服务器.通用的T ...