巨蟒python全栈开发-第19天 核能来袭-反射
一.今日主要内容
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天 核能来袭-反射的更多相关文章
- 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理
一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...
- 巨蟒python全栈开发-第16天 核能来袭-初识面向对象
一.今日内容总览(上帝视角,大象自己进冰箱,控制时机) #转换思想(从面向过程到面向对象) 1.初识面向对象 面向过程: 一切以事物的发展流程为中心. 面向对象: 一切以对象为中心,一切皆为对象,具体 ...
- 巨蟒python全栈开发-第17天 核能来袭-成员
一.今日主要内容 1.成员 在类中你能写的所有内容都是类的成员 2.变量 (1)实例变量:昨天写的就是实例变量,由对象去访问的变量. (2)类变量(静态变量):此时,这个变量属于类,但是对象也可以访问 ...
- 巨蟒python全栈开发-第18天 核能来袭-类和类之间的关系
一.今日主要内容: 1.类与类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中,类和类之间也可以产生相关的关系 (1)依赖关系 执行某个动作(方法)的时候,需要xxx来帮助你完成 ...
- 巨蟒python全栈开发linux之centos3
1.作业讲解 (1)递归创建文件夹/tmp/oldboy/python/{alex,wusir,nvshen,xiaofeng} 下面中的路径没有必要换,在哪里创建都行,根目录下或者tmp目录下或者其 ...
- 巨蟒python全栈开发linux之centos1
1.linux服务器介绍 2.linux介绍 3.linux命令学习 linux默认有一个超级用户root,就是linux的皇帝 注意:我的用户名是s18,密码是centos 我们输入密码,点击解锁( ...
- 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解
1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...
- 巨蟒python全栈开发flask9 项目开始1
1.项目需求分析 立项:Javis&&taisen(三个月全部,先模拟出一个玩具,硬件需要周期长一些) 想法 --- 需求分析: .通过玩具与孩子实时进行沟通 .希望玩具的知识渊博 . ...
- 巨蟒python全栈开发linux之centos6
1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...
随机推荐
- python3操作mysql教程
一.下载\安装\配置 1. python3 Python3下载网址:http://www.python.org/getit/ 当前最新版本是python3.2,下载地址是 http://www.pyt ...
- Web App、Hybrid App、Native APP对比
- Centos下运行定时任务Crontab命令介绍
1.Cron的启动与关闭 因为Cron是Linux的内置服务.能够用下面的方法启动.关闭这个服务: /sbin/service crond start //启动服务 /sbin/s ...
- Controller Service Dao总结
今天主要学习了Controller,Service,Dao的相关知识 我的理解主要是这种,Controller主要与前台页面打交道 比方:前台页面有一个"加入用户"的提交butto ...
- erlang supervisor simple_one_for_one实例
simple_one_for_one vs one_for_one: 相同点: 这种Restart Strategy和one_for_one基本相同(即当一个child process挂掉后,仅仅重启 ...
- [转载]ecmall语言包程序
[转载]ecmall语言包程序 (-- ::) 转载▼ 标签: 转载 收藏了 原文地址:ecmall语言包程序作者:我思故我在 执行顺序 登陆后台后 最先执行的文件是 default.app.php ...
- Hadoop--mapreduce编程实例1
前提准备: 1.hadoop安装运行正常.Hadoop安装配置请参考:Ubuntu下 Hadoop 1.2.1 配置安装 2.集成开发环境正常.集成开发环境配置请参考 :Ubuntu 搭建Hadoop ...
- linux学习笔记29---命令watch
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...
- 1.2.3 Task and Back Stack - 任务和回退堆
一个应用通常包含多个Activities.每个activity的设计应该围绕着某种指定类型的action,如果这样做了,用户就可以执行该action,也可以用它来开启另外的activity.例如,邮件 ...
- 浅谈myeclipse2015做cordova/phonegap开发
近期公司项目经理要求用cordova写安卓程序,之前对cordova什么都不懂,然后从网上搜啊搜,好歹有所了解了,感觉做web开发的比較合适,属于三种开发模式的第三种. myeclipse2015有个 ...