1. 11. __new__ __metaclass__
  2.  
  3. 阅读以下代码:
  4.  
  5. 1
  6. 2
  7. 3
  8. 4
  9. 5
  10. 6
  11. class Foo(object):
  12.  
  13. def __init__(self):
  14. pass
  15.  
  16. obj = Foo() # obj是通过Foo类实例化的对象
  17. 上述代码中,obj 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。
  18.  
  19. 如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。
  20.  
  21. 1
  22. 2
  23. print type(obj) # 输出:<class '__main__.Foo'> 表示,obj 对象由Foo类创建
  24. print type(Foo) # 输出:<type 'type'> 表示,Foo类对象由 type 类创建
  25. 所以,obj对象是Foo类的一个实例,Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。

  

一、isinstance and issubclass

isinstance(obj,cls)检查是否obj是否是类cls的对象

  1. #对象与类的关系
    #判断第一个参数是否是第二个参数的实例
    class A:pass
    class B(A):pass
    class C(B):pass
    c = B()
    print(isinstance(c,A)) #包含继承关系的判断.
    #结果 True
  2.  
  3. issubclass (sub,super)检查sub类是否是super类的派生类
    #类与类之间的关系
  4.  
  5. print(issubclass(C,B))
    #结果为True
  6.  
  7. 反射
  8.  
  9. 1.什么是反射
    只要是指程序可以访问、检测和修改他本身状态或者
    或行为的一种能力。
    2. python面向对象中的反射:通过字符串的形式操作对象相关的属性,python中的一切事物都是对象(都可以使用反射)
    四个可以实现自省的函数
  10.  
  11. 下列方法适用于类和对象
  12.  
  13. hasattr(判断某一个变量是否能够调用一个名字,返回True或者False
  1. class Foo:
    f ='类的静态变量'
    def __init__(self,name,age):
    self.name =name
    self.age =age
    def say_hi(self):
    print("hi,%s " %self.name)
  2.  
  3. obj= Foo('egon',73)
  4.  
  5. # #检测是否还有某种属性
    # print(hasattr(obj, 'name'))
    # print(hasattr(obj,'sya_hi'))
    # 打印结果:
    # True# False
  1. getattr (直接获取一个变量中的名字的值)
  1. #获取属性
    n= getattr(obj,'name')
    print(n)
    #结果:egon
  2.  
  3. func =getattr(obj,'say_hi')
    func()
    #结果:hi, egon
    # print(getattr(obj,'aaaaa',))#报错。
  1.  
  2. setattr (为一个变量增加或者修改一个属性)
  1. # 设置属性
    setattr(obj,'sb',1)
    # setattr(obj,'show_name',lambda self:self.name+'sb')
    print(obj.__dict__)
    # 打印结果:{'name': 'egon', 'age': 73, 'sb': 1}
  2.  
  3. # print(obj.show_name(obj))
  1.  
  2. delattr (删除一个变量中的属性或者方法)
  1. delattr(obj,"age")
    # delattr(obj,"show_name")
    print(obj.__dict__)
    #输出结果{'name': 'egon', 'sb': 1}
  2.  
  3. a.b 的形式
    d ={'k':'v'}
    print(getattr(d,"key")
  4.  
  5. 三、包的反射
  1. def wahaha(self, a, b):
    print(a, b)
  2.  
  3. setattr(hei,'func',wahaha)
    hei.func(hei,1,2)
  4.  
  5. # f = open() #文件操作对象
    # f.read() #文件对象,read 方法.
    # 模块名.函数名
  6.  
  7. #此py文件名为my_moudle
    money = 1000
    def qqxing():
    print('qqxing')
  8.  
  9. #另外一个sheet
    import my_module
    # print(my_module.money)#结果为1000
  10.  
  11. #或者如下
    print(getattr(my_module,'money'))#输出结果1000
    getattr(my_module,'qqxing')()#结果为qqxing
  1. def sww():
  2. print('爽歪歪')
  3. count =
  4. import sys
  5. import my_module
  6. print(sys.modules[__name__]) #一定是当前的名字aaa.py
  7. #结果为 : <module '__main__' from 'D:/parcharm/12/Day24/1.py'>
  8. print(sys.modules['__main__'])# 不确定的。 <module '__main__' from 'D:/parcharm/12/Day24/1.py'>
  9. print(getattr(sys.modules[__name__],'count')) #结果为
  10. getattr(sys.modules[__name__],'sww')() #结果为爽歪歪
  11. print(sys.modules[__name__]) #输出结果:<module '__main__' from 'D:/parcharm/12/Day24/1.py'>
  12. print(sys.modules['my_module'])
  13. # 结果 <module 'my_module' from 'D:\\parcharm\\my_module.py'>
  14. print(my_module)
  15. #结果<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__':当前模块的内存地址}

  1.  

# 怎么反射类 ?
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 类的进阶-反射的更多相关文章

  1. python 类的进阶

    类的进阶 一 isinstance(obj,cls)和issubclass(sub,super) class Foo: def __init__(self,name): self.name = nam ...

  2. Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究

    Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: ​ 反射的概念是由Smith在1982年首次提出的 ...

  3. C# 直接创建多个类和使用反射创建类的性能

    原文:C# 直接创建多个类和使用反射创建类的性能 本文告诉大家我对比的使用直接创建多个类和使用反射创建多个类的性能 在上一篇 C# 程序内的类数量对程序启动的影响 的基础上,继续做实验 现在创建 10 ...

  4. 2019-11-29-C#-直接创建多个类和使用反射创建类的性能

    原文:2019-11-29-C#-直接创建多个类和使用反射创建类的性能 title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 li ...

  5. 2019-8-31-C#-直接创建多个类和使用反射创建类的性能

    title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 lindexi 2019-08-31 16:55:58 +0800 2018 ...

  6. 044-PHP获得多个类对应的反射信息

    <?php //获得多个类对应的反射信息 class demo{ public $str_1; private $str_2; protected $str_3; public function ...

  7. 043-PHP简单获得一个类对应的反射信息

    <?php // 简单获得一个类对应的反射信息 class demo{ CONST CON_STR = '123456'; public $str_1; private $str_2; prot ...

  8. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  9. python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法

    目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...

随机推荐

  1. php 使用html5 XHR2 上传文件 进度显示

    思路:只要我们知道上传文件的总大小,还有上传过程中上传文件的大小,那么就可以实现进度显示了. 在html5中,XMLHttpRequest对象,传送数据的时候,progress事件用来返回进度信息. ...

  2. 使用springmvc从页面中获取数据,然后根据获得的参数信息进行修改,如果修改的数据中含有不是基本数据类型的参数。比如传的参数中有Date类型的数据时,需要我们进行参数类型转换。

    1.1 需求 在商品修改页面可以修改商品的生产日期,并且根据业务需求自定义日期格式. 1.2 需求分析 由于日期数据有很多格式,所以springmvc没办法把字符串转换成日期类型.所以需要自定义参数绑 ...

  3. Silverlight实用窍门系列:57.Silverlight中的Binding使用(二)-数据验证

    本文将简单讲述Silverlight中的Binding数据时的数据验证. NotifyOnValidationError:是否在出现异常/错误信息的时候激发BindingValidationError ...

  4. 图像获取与采集及图像格式与Region介绍——第2讲

    一.图像获取与采集 1.本地图片读取 ① 单张读取 直接传入图片路径即可,可以用绝对路径,也可以用相对路径: read_image (Image, 'C:/Users/Administrator/De ...

  5. android 混淆文件proguard.cfg详解 (转载)

    -injars  androidtest.jar[jar包所在地址] -outjars  out[输出地址] -libraryjars    'D:\android-sdk-windows\platf ...

  6. C#集合类型大盘点(转载)

    原文地址:http://www.cnblogs.com/jesse2013/p/CollectionsInCSharp.html#b02

  7. JSONModel简便应用

    JSONModel, Mantle 这两个开源库都是用来进行封装JSON->Model的, 想想看, 直接向服务器发起一个请求,然后回来后,就是一个Model, 直接使用, 这是一个多么美好的事 ...

  8. 2018.09.15 hdu3018Ant Trip(欧拉路)

    传送门 显然答案等于各个连通分量的笔画数之和. 因此我们dfs每个连通分量计算对答案的贡献. 对于一个连通分量,如果本来就有欧拉回路那么只需要一笔. 否则需要寄点数/2那么多笔才能画完. 知道这个结论 ...

  9. 44 The shopping psychology 购物心理

    The shopping psychology 购物心理 ①People can be addicted to different things ---e. g.,alcohol, drugs, ce ...

  10. UVa 11636 Hello World! (水题思维)

    题意:给你一个数,让你求需要复制粘贴多少次才能达到这个数. 析:这真是一个水题,相当水,很容易知道每次都翻倍,只要大于等于给定的数就ok了. 代码如下: #include <iostream&g ...