Day 27 类的进阶-反射
11. __new__ 和 __metaclass__ 阅读以下代码: 1
2
3
4
5
6
class Foo(object): def __init__(self):
pass obj = Foo() # obj是通过Foo类实例化的对象
上述代码中,obj 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。 如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。 1
2
print type(obj) # 输出:<class '__main__.Foo'> 表示,obj 对象由Foo类创建
print type(Foo) # 输出:<type 'type'> 表示,Foo类对象由 type 类创建
所以,obj对象是Foo类的一个实例,Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。
一、isinstance and issubclass
isinstance(obj,cls)检查是否obj是否是类cls的对象
#对象与类的关系
#判断第一个参数是否是第二个参数的实例
class A:pass
class B(A):pass
class C(B):pass
c = B()
print(isinstance(c,A)) #包含继承关系的判断.
#结果 True issubclass (sub,super)检查sub类是否是super类的派生类
#类与类之间的关系 print(issubclass(C,B))
#结果为True 二 、 反射 1.什么是反射
只要是指程序可以访问、检测和修改他本身状态或者
或行为的一种能力。
2. python面向对象中的反射:通过字符串的形式操作对象相关的属性,python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数 下列方法适用于类和对象 hasattr(判断某一个变量是否能够调用一个名字,返回True或者False)
class Foo:
f ='类的静态变量'
def __init__(self,name,age):
self.name =name
self.age =age
def say_hi(self):
print("hi,%s " %self.name) obj= Foo('egon',73) # #检测是否还有某种属性
# print(hasattr(obj, 'name'))
# print(hasattr(obj,'sya_hi'))
# 打印结果:
# True# False
getattr (直接获取一个变量中的名字的值)
#获取属性
n= getattr(obj,'name')
print(n)
#结果:egon func =getattr(obj,'say_hi')
func()
#结果:hi, egon
# print(getattr(obj,'aaaaa',))#报错。
setattr (为一个变量增加或者修改一个属性)
# 设置属性
setattr(obj,'sb',1)
# setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
# 打印结果:{'name': 'egon', 'age': 73, 'sb': 1} # print(obj.show_name(obj))
delattr (删除一个变量中的属性或者方法)
delattr(obj,"age")
# delattr(obj,"show_name")
print(obj.__dict__)
#输出结果{'name': 'egon', 'sb': 1} a.b 的形式
d ={'k':'v'}
print(getattr(d,"key") 三、包的反射
def wahaha(self, a, b):
print(a, b) setattr(hei,'func',wahaha)
hei.func(hei,1,2) # f = open() #文件操作对象
# f.read() #文件对象,read 方法.
# 模块名.函数名 #此py文件名为my_moudle
money = 1000
def qqxing():
print('qqxing') #另外一个sheet
import my_module
# print(my_module.money)#结果为1000 #或者如下
print(getattr(my_module,'money'))#输出结果1000
getattr(my_module,'qqxing')()#结果为qqxing
def sww():
print('爽歪歪')
count =
import sys
import my_module
print(sys.modules[__name__]) #一定是当前的名字aaa.py
#结果为 : <module '__main__' from 'D:/parcharm/12/Day24/1.py'>
print(sys.modules['__main__'])# 不确定的。 <module '__main__' from 'D:/parcharm/12/Day24/1.py'>
print(getattr(sys.modules[__name__],'count')) #结果为
getattr(sys.modules[__name__],'sww')() #结果为爽歪歪
print(sys.modules[__name__]) #输出结果:<module '__main__' from 'D:/parcharm/12/Day24/1.py'>
print(sys.modules['my_module'])
# 结果 <module 'my_module' from 'D:\\parcharm\\my_module.py'>
print(my_module)
#结果<module 'my_module' from 'D:\\parcharm\\my_module.py'>
# 反射类中的名字
# getattr(类名,'静态属性')
# getattr(类名,'类方法')()
# getattr(类名,'静态方法')()
# 反射对象中的名字
# getattr(对象名,'对象属性')
# getattr(对象名,'方法名')()
# 反射模块中的名字
# import 模块名
# getattr(模块名,'模块中的变量')
# getattr(模块名,'模块中的函数')()
# getattr(模块名,'模块中的类名')
# 反射当前模块中的名字
# import sys
# getattr(sys.modules[__name__],'变量')
# getattr(sys.modules[__name__],'函数')()
# getattr(sys.modules[__name__],'类名')
# sys.modules[__name__]
# import sys
# print(sys.modules[__name__]) # 所有导入过的模块
# {'字符串数据类型的模块名':模块的内存地址}
# {'__main__':当前模块的内存地址}
# 怎么反射类 ?
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def show_student(self):
for key in self.__dict__:
print(key,self.__dict__[key])
class Teacher:
def __init__(self, name, age):
self.name = name
self.age = age
def show_teacher(self):
for key in self.__dict__:
print(key, self.__dict__[key])
class Manager:
def __init__(self, name, age):
self.name = name
self.age = age
def show_manager(self):
for key in self.__dict__:
print(key, self.__dict__[key])
# hei = Student('小黑',18)
import sys
main = sys.modules[__name__]
# import my_moudle
# cls = getattr(my_moudle,'Student')
# hei = cls('小黑',18)
# print(hei,hei.__dict__)
# 'Manager' 'Teacher' 'Student'
# 获取字符串数据类型的类名
cls_name = input('>>>')
# 根据输入反射找到具体的类
if hasattr(main,cls_name):
cls = getattr(main,cls_name)
# 实例化对象
alex = cls('alex',81)
print(type(alex))
# 展示这个对象中的所有方法
for i in alex.__dict__:
print(i,alex.__dict__[i])
# 用反射的知识 实现
# 写一个人类,这个人类 没有任何属性 实例化这个类 然后根据你的姓名和年龄为这个对象添加属性 (基础)
# 登录成功之后自动创建和用户身份匹配的类的对象 (提高)
Day 27 类的进阶-反射的更多相关文章
- python 类的进阶
类的进阶 一 isinstance(obj,cls)和issubclass(sub,super) class Foo: def __init__(self,name): self.name = nam ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- C# 直接创建多个类和使用反射创建类的性能
原文:C# 直接创建多个类和使用反射创建类的性能 本文告诉大家我对比的使用直接创建多个类和使用反射创建多个类的性能 在上一篇 C# 程序内的类数量对程序启动的影响 的基础上,继续做实验 现在创建 10 ...
- 2019-11-29-C#-直接创建多个类和使用反射创建类的性能
原文:2019-11-29-C#-直接创建多个类和使用反射创建类的性能 title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 li ...
- 2019-8-31-C#-直接创建多个类和使用反射创建类的性能
title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 lindexi 2019-08-31 16:55:58 +0800 2018 ...
- 044-PHP获得多个类对应的反射信息
<?php //获得多个类对应的反射信息 class demo{ public $str_1; private $str_2; protected $str_3; public function ...
- 043-PHP简单获得一个类对应的反射信息
<?php // 简单获得一个类对应的反射信息 class demo{ CONST CON_STR = '123456'; public $str_1; private $str_2; prot ...
- Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法
Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...
- python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法
目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...
随机推荐
- CentOS设置yum存储库 (nginx)
要为RHEL / CentOS设置yum存储库,请创建/etc/yum.repos.d/nginx.repo 使用以下内容命名的文件 : [nginx] name=nginx repo baseurl ...
- MQ java 基础编程
MQ java 基础编程 编写人:邬文俊 编写时间 : 2006-2-16 联系邮件 : wenjunwu430@gmail.com 前言 通过 2 个多星期对 MQ 学习,在 partner 丁 & ...
- DNA甲基化研究概述
DNA甲基化研究概述 生信技能树 已关注 2018.01.23 11:43 字数 993 阅读 183评论 0喜欢 1 DNA甲基化(DNA methylation)是最早被研究的重要表观遗传修饰之一 ...
- POJ2585 Window Pains 拓扑排序
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1843 Accepted: 919 Descr ...
- VisulaVM 性能:分析 JVM 性能的免费工具
VisualVM是一个集成多个JDK命令行工具的可视化工具.可以作为Java应用程序性能分析和运行监控的工具.开发人员可以利用它来监控.分 析线程信息,浏览内存堆数据.系统管理员可以利用它来监测.控制 ...
- 用户体验要好,App动画得这么做
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 在用户体验设计方面,App动画的设计和添加,带给设计师无限的创造空间的同时,也成为设计师群体最具 ...
- div添加滚动条常见属性
由于页面上的表里的末一列的内容太多,显示的内容不美观了,就想在这一列上加滚动条,在网上搜了一下,用div可以实现,感觉还不错,下面的是在网上查到的. 想在div里添加滚动条设置一下style就ok了 ...
- Spark实践 -- 性能优化基础
性能调优相关的原理讲解.经验总结: 掌握一整套Spark企业级性能调优解决方案:而不只是简单的一些性能调优技巧. 针对写好的spark作业,实施一整套数据倾斜解决方案:实际经验中积累的数据倾斜现象的表 ...
- 2018.09.25 51nod1597 有限背包计数问题(背包+前缀和优化)
传送门 dp好题. 我认为原题的描述已经很清楚了: 你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少. 两种方案不同当且仅当存在至少一个数i满足第i种 ...
- 2018.06.30 BZOJ4443: [Scoi2015]小凸玩矩阵(二分加二分图匹配)
4443: [Scoi2015]小凸玩矩阵 Time Limit: 10 Sec Memory Limit: 128 MB Description 小凸和小方是好朋友,小方给小凸一个N*M(N< ...