一.今日主要内容

1.isinstance,type,issubclass
A.isinstance: 判断你给对象是否是xx类型的. (向上判断)
B.type: 返回xxx对象的数据类型
C.issubclass: 判断xxx类是否xxx的子类 (1)day11介绍过是否是可迭代的和是否是迭代器
(2)issubclass( 判断类是否为某类的子类//查看某一个类是否为另一个类的派生类 )
(3)isinstance (对象;判断类型)
(4)type:类型 2.如何区分方法和函数(代码)
在类中:
实例方法:
如果是类名.方法 函数
如果是对象.方法 方法
类方法:都是方法
静态方法:都是函数 from types import MethodType, FunctionType
isinstance() 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)类变量和示例变量的区别?

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

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

isinstance: 判断xxx是否是xxx类型的(向上判断)
type 返回xx对象的数据类型
'''
#自己总结
(1)注意两者的写法是有区别的 (2)A:type()不会认为子类是一种父类类型,不考虑继承关系
B:isinstance() 会认为子类是一种父类类型,考虑继承关系 示例:
class Animal:
def eat(self):
print('刚睡醒吃点儿东西')
class Cat(Animal):
def play(self):
print('猫喜欢玩儿')
c=Cat()
print(isinstance(c,Cat)) # True c是一只猫
print(isinstance(c,Animal)) # True print(type(c)==Cat)
print(type(c)==Animal)
print(type(c)) #<class '__main__.Cat'>
'''

(4)

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

(5)

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

(6)

class StarkConfig(object):
list_display=[] #类变量是共享出去的
def get_list_display(self):
self.list_display.insert(0,33)
return self.list_display
class RoleConfig(StarkConfig):
list_display=[11,22] s1=StarkConfig()
s2=StarkConfig() result1=s1.get_list_display()
print(result1)
result2=s2.get_list_display()
print(result2) print(result1 is result2)
print(s1.list_display)
'''
结果:
[33]
[33, 33]
True
[33, 33]
'''
#最后的result1和result2的内存地址是一样的,所以显示True
#要想自己创建自己的

(7)

class StarkConfig(object):
list_display=[]
def get_list_display(self):
self.list_display.insert(0,33)
return self.list_display
class RoleConfig(StarkConfig):
list_display = [11,22]
s1=StarkConfig()
s2=RoleConfig()
result1=s1.get_list_display()
print(result1)
result2=s2.get_list_display()
print(result2)
#看下内存地址
print(result1 is result2)
print(id(result1))
print(id(result2)) 结果:
[33]
[33, 11, 22]
False
1762754727304
1762754727688

(8)

class StarkConfig(object):
list_display=[]
def get_list_display(self):
self.list_display.insert(0,33)
return self.list_display
class RoleConfig(StarkConfig):
list_display=[11,22]
s1=RoleConfig()
s2=RoleConfig()
result1=s1.get_list_display()
print(result1)
result2=s2.get_list_display()
print(result2) 结果:
分析同第六题的继承
#用的是同一份类变量
结果:
[33, 11, 22]
[33, 33, 11, 22]

(9)

class Base(object):
pass
class Foo(Base):
pass
print(issubclass(Base,Foo)) #结果:False

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

#要求:
如果有以下handler.py文件,请run.py中补充代码实现:
获取handler中所有成员名称:dir(handler)
获取handler中名字叫Base的成员
检查其他成员是否是Base类的子类(不包含Base),如果是则创建对象并添加到objs列表中
# #原例
# handler.py文件内的内容
class Base(object):
pass
class F1(Base):
pass
class F2(Base):
pass
class F3(F2):
pass
class F4(Base):
pass
class F5(object):
pass
class F6(F5):
# pass #run,py
import handler
def func():
objs=[]
name_list=dir(handler) #简介:查看xx对象中的所有的内容,迭代器中用过
print(name_list)
if __name__== '__main__':
func() #自己测试的程序
import handler
def func():
objs=[]
name_list=dir(handler) #简介:查看xx对象中的所有的内容,迭代器中用过
print(name_list)
# print(dir(handler)) #整合,上边的两行
if __name__== '__main__':
func() # 理解的知识点
# print(help(dir()))
#builtins 内置函数 #老师讲解:#(重点题目,需要反复理解issubclass,type,isinstance)
import handler
def func():
objs=[]
name_list=dir(handler) #简介:查看xx对象中的所有的内容,迭代器中用过
print(name_list)
'''
#结果是:
['Base', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', '__builtins__', '__cached__',
'__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
'''
base=getattr(handler,'Base') #拿到Base类
print(base)
'''
#结果是:
<class 'handler.Base'>
'''
for el in name_list: #从模块中的所有的名字中拿到每一个名字
if not el.startswith('__')and issubclass(getattr(handler,el),base)and el!='Base':
#不是父类本身;不是以__开头的;是base的子类,通过得到每一个类名;三个条件的交集
#双下划线开头和结束的是模块
#getattr(handler,el)得到模块里边的类名
objs.append(getattr(handler,el)()) #因为要放的是对象,所以要加上括号
print(objs) # print(name_list)
# print(dir(handler)) #整合
if __name__== '__main__':
func() '''
getattr():从xxx对象中获取到xxx属性值
本题是:getattr(handler,el)得到模块里边的类名
'''

(12)

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

(13)

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

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

# A.
class Foo: #类是不可迭代的
pass #'Foo' object is not iterable
f=Foo()
for e in f:
print(e) #B. 将类变成可迭代的
class Foo:
def __iter__(self):
return (i for i in range(10)) #生成器表达式
f=Foo()
for e in f:
print(e)
'''
结果:
0
1
2
3
4
5
6
7
8
9
'''

(15)

15.如何让一个对象可以被执行?
在类中添加 __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. MONGODB Date 处理方法

    mongodb 日期处理:1,用new Date()存入数据库,要转一下.2,输出的显示的时候,要把data 后的Z 去啦.3, 查询时数据时不用处理.

  2. 实战Nginx负载均衡高冗余高可用WEB架构

       最近公司主力网站之一改版完成终于上线了,牵扯了我大半年的时间,现在终于有时间坐下来写点东西,总结沉淀一下自己的技术心得.此次,根据服务器的数量和质量,我采用负载均衡高冗余的架构,考虑单点故障,W ...

  3. 【Android界面实现】View Animation 使用介绍

        转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992     我们能够使用view animation 动画系统来给View控件加入tween动画(下称& ...

  4. Java小型知识点

    1. API 1.1 byte[].File.InputStream 互相转换 1.将File.FileInputStream 转换为byte数组: File file = new File(&quo ...

  5. FPGA的图像处理技术

    最近一段时间一直在研究基于FPGA的图像处理,乘着EEPW这个机会和大家交流一下,自己也顺便总结一下.主要是为了大家对用FPGA做图像处理有个感性的认识,如果真要研究的话就得更加深入学习了.本人水平有 ...

  6. windows编译tensorflow c++库

    1. 准备 windows 10系统.3.6GHz cpu.16G 内存 visual studio 2017 or 2015 下载安装git 下载安装cmake 下载安装swigwin 如果不需要p ...

  7. struts-config message-resources配置问题总结

    问题:我的app无法读取配置好的ApplicationResources.properties中的内容 解答:文件目录为 /webapp /WEB-INF /classes ApplicationRe ...

  8. C1编译器的实现

    总览 词法.语法分析 分析方案 词法 语法 符号表 类型系统 AST 语义检查 EIR代码生成器 MIPS代码生成器 寄存器分配 体系结构相关特性优化 使用说明 编译 运行 总览 C1语言编译器及流程 ...

  9. CAP定理(原则)以及BASE理论

    CAP定理(原则)以及BASE理论 CAP定理(原则)概念 CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partiti ...

  10. 配置Docker中国区官方镜像http://get.daocloud.io/ 很好的一个源http://get.daocloud.io/#install-docker

    https://www.daocloud.io/mirror#accelerator-doc 配置Docker中国区官方镜像http://get.daocloud.io/ 很好的一个源http://g ...