一.今日主要内容

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. FreeMarker静态化文件解决SEO推广问题

    1.问题背景 SEO一直是站点对外推广的一个重要手段,如何可以让搜索引擎高速搜索到站点对于增强站点的浏量,提升站点对外形象有着重要意义.那么如何可以对SEO进行优化呢?一个很经常使用的手段就是在网页的 ...

  2. python3 logging 日志记录模块

    #coding:utf-8 import logginglogging.basicConfig(filename='log1.log', format='%(asctime)s -%(name)s-% ...

  3. Java并发编程(一):并发与高并发等基础概念

    并发概念 同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时存在的,每个线程都处于执行过程中的某个状态.如果运行在多核处理器上,程序中的每个线程都将 ...

  4. 利用inotifywait监控主机文件和目录

    利用inotifywait监控主机文件和目录 inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ...

  5. C# 时间格式 yyyy/mm/dd

    今天遇到个问题在C#中将日期格式设置为yyyy/MM/dd,我是这样写的: DateTime.Now.ToString("yyyy/MM/dd"); 可是获取到的日期还是显示yyy ...

  6. Using Fast Weights to Attend to the Recent Past

    Ba, Jimmy, et al. "Using Fast Weights to Attend to the Recent Past." Advances In Neural In ...

  7. poj 2187:Beauty Contest(计算几何,求凸包,最远点对)

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 26180   Accepted: 8081 D ...

  8. JS encodeURI和encodeURIComponent

    一.最常用的encodeURI和encodeURIComponent 对URL编码是常见的事,所以这两个方法应该是实际中要特别注意的.它们都是编码URL,唯一区别就是编码的字符范围,其中encodeU ...

  9. Bellman-Ford算法(有向图)

    #include <iostream> #include <cstring> #include <cstdio> #define MAX 100 #define I ...

  10. @RequestParam 注解

    @RequestParam 注解org.springframework.web.bind.annotation.RequestParam注解类型用于将指定的请求参数赋给方法中的形参.使用@Reques ...