1. issubclass, type, isinstance

    issubclass 判断XXX类是否是XXX类的子类  
type 给出XXX的数据类型. 给出创建这个对象的类
isinstance 判断XXX对象是否是XX类型的实例
  
class Animal:
pass class Cat(Animal):
pass class BoSiCat(Cat):
pass print(issubclass(Cat, Animal)) # 判断第一个参数是否是第二个参数的后代
print(issubclass(Animal, Cat))
print(issubclass(BoSiCat, Animal)) # True

issubclass()

class Cat(Animal):
pass class BoSiCat(Cat):
pass c = Cat()
print(type(c)) # 比较精准的给出对象的类 # 计算a+b的结果并返回. 两个数相加
def add(a, b):
if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
return a + b
else:
print("算不了") print(add("胡汉三", 2.5))

type()

 
 
class Animal:
pass class Cat(Animal):
pass class BoSiCat(Cat):
pass a = Animal()
print(isinstance(a, Animal)) # 自己类可以判断
print(isinstance(a, Cat)) # 子类不能判断 c = BoSiCat()
print(isinstance(c, Animal)) # True 子类的对象可以当成父类的类型来看.
# isinstance判断的是对象是否是xxx家族体系的内容. 往上找 lst = "马化腾"
print(type(lst.__iter__())) li = []
print(type(li.__iter__()))

isinstance

2. 如何分辨方法和函数
在外面定义的函数一定是函数
在类中:
1. 实例方法: 如果是对象访问,是方法. 如果是类名访问,是函数.
2. 静态方法: 都是函数
3. 类方法: 都是方法
如果想用程序来判断, 需要引入两个模块.
from types import FunctionType, MethodType
print(isinstance(arg, FunctionType)) 判断对象是否是函数
print(isinstance(arg, MethodType)) 判断对象是否是方法
def func():
print("我是func") print(func) # <function func at 0x00000253260678C8> class Foo:
# 实例方法: 对象.方法 方法 类名.方法 函数
def chi(self):
print("我是吃") @staticmethod # 都是函数
def static_method():
pass @classmethod # 都是方法
def class_method(cls): # 类对象的内容
pass
@property # 神马都不是. 变量
def age(self):
return 10 # 引入两个模块
from types import FunctionType, MethodType def haha(arg):
print(isinstance(arg, FunctionType)) # False
print(isinstance(arg, MethodType)) # True haha(Foo.class_method)
haha(Foo.age) # age不是函数,也不是方法,是变量 # f = Foo()
# print(f.chi) # <bound method Foo.chi of <__main__.Foo object at 0x0000022D69C48390>>
# Foo.chi(f)
# print(Foo.chi) # <function Foo.chi at 0x000001A4BBEE79D8>
#
# print(f.static_method) # <function Foo.static_method at 0x000002BBD2DB7A60>
# print(Foo.static_method) # <function Foo.static_method at 0x00000233E2247A60>
#
# print(f.class_method) # <bound method Foo.class_method of <class '__main__.Foo'>>
# print(Foo.class_method) # <bound method Foo.class_method of <class '__main__.Foo'>>

区分function和method

3. 反射(重点)
仅限于内存层面
重点:
hasattr(obj, str) 判断对象中是否包含了xxx(str)
getattr(obj, str) 从对象中获取xxxx(str)
次重点:
setattr(obj, str, value) 给对象设置xxxx(str)属性值(value)
delattr(obj, str) 从对象中删除xxxxx(str)信息
class Person:
def __init__(self, name):
self.name = name
self.age = None def chi(self):
print("人喜欢吃东西%s" % self.name) p = Person("刘伟")
setattr(p, "name", "大阳哥") # 动态的给对象设置属性和值
setattr(p, "age", 18) # 很少用. 慎用 print(p.age)
# delattr(p, "age")
# print(p.age) p.chi() val = input("请输入你想让刘伟执行的动作:")
if hasattr(p, val):
getattr(p, "name")
func = getattr(p, val)
func()

setattr(),hasattr(),getattr()

准备两个py文件master和test,master中有写好的函数,在test中引入master,用test去测试。

def chi():
print("大牛一顿吃100碗饭") def he():
print("大牛一顿喝一桶") def la():
print("大牛很能拉") def shui():
print("大牛一次睡一年") name = "大牛"

master

import master

while 1:
print("""大牛写了很多的功能:
chi
he
la
shui
""")
val = input("请输入你要测试的功能") # he if hasattr(master, val):
attr = getattr(master, val) # 从xxx对象或者模块中找xxxxx(字符串) 功能, 变量
if callable(attr): # 判断这个鬼东西是否可以被调用
attr()
else:
print(attr)
else:
print("没有这个功能") #如果不使用getattr(),则无法调用
# master.val()
#
# master."chi"() # 低配版,手动录入,繁琐
# if val == 'chi':
# master.chi()
# elif val == "he":
# master.he()
# elif val == "la":
# master.la()
# elif val == "shui":
# master.shui()
# else:
# print("滚犊子") # 把chi函数换成lambda
print(master.chi)
setattr(master, "chi", lambda x: x + 1)
print(master.chi)
print(master.chi(1))
#
# delattr(master, "la") # 删除xxx
# master.la()

test

												

Day019--Python--反射的更多相关文章

  1. python 反射

    python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! 反射的四个基本函数使用 hasattr,getattr,setatt ...

  2. python反射

    python反射 python的反射是基于字符串的形式去对象(模块)中操作其成员.此操作是动态的,常用于web开发中url参数中对应模块或者函数的反射. 下面开始具体说明: 场景需求: 我的pytho ...

  3. Python反射机制理解

    Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员. getattr(object, name) object代表模块,name代表模块中的属性或成员,该函 ...

  4. 小学生绞尽脑汁也学不会的python(反射)

    小学生绞尽脑汁也学不会的python(反射) 1. issubclass, type, isinstance issubclass 判断xxxx类是否是xxxx类的子类 type 给出xxx的数据类型 ...

  5. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  6. python反射问题

    python中的__import__是以字符串的形式反射导入模块并以字符串的形式执行函数

  7. python 反射的使用

    反射这个功能在很多编程语言中都有,在Python中自然也不例外.其实编程语言中的很多功能都能用简单的代码来验证. 在code代码之前,先简单的了解下反射的几个属性. hasattr(obj,name_ ...

  8. python 反射调用

    因为目前在写一个python的项目,用到了Python的反射机制,所以做一下笔记,把写项目过程中的感悟记下来. 先简单介绍下Demo用到的函数: sys.path 是python的模块的路径集,是一个 ...

  9. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  10. python反射和面向对象的知识并简述基本的异常

    # 1.面向对象不是所有的情况都适用# 2.面向对象编程# a.定义类# class Foo:# def 方法1(self,bb):# b.根据类创建对象(创建) # class Person():# ...

随机推荐

  1. WPF一步步实现完全无边框自定义Window(附源码)

    在我们设计一个软件的时候,有很多时候我们需要按照美工的设计来重新设计整个版面,这当然包括主窗体,因为WPF为我们提供了强大的模板的特性,这就为我们自定义各种空间提供了可能性,这篇博客主要用来介绍如何自 ...

  2. 关于WPF中Popup中的一些用法的总结

    Popup控件是一个常用的非常有用的控件,顾明思义就是弹出式控件,首先我们来看看MSDN对它的解释吧,表示具有内容的弹出窗口,这个是非常重要的控件,我们看看它的继承关系吧: System.Object ...

  3. Front-end Job Interview Questions

    Front-end Job Interview Questions 前端面试 https://github.com/h5bp/Front-end-Developer-Interview-Questio ...

  4. 3.ansible-iventory的写法和基本变量

    ansible的配置文件一点要多考虑,有些设定比如ssh端口啊用户啊线程啊都尽量在里面调节好iventory的话/etc/ansible/hosts 里面可以使用正则匹配ansible从invento ...

  5. DeepLearning训练方法

    1.BN层训练技巧 缩小输入尺寸,这样可以提高batchsize的大小,在BN层适应了该数据集后,固定住BN层参数,放大输入尺寸继续训练 2.语义分割中解决网络输出尺寸与原尺寸的gap方法(如 1/8 ...

  6. Tomcat的四种web应用部署方式详解

    在Tomcat中有四种部署Web应用的方式,简要的概括分别是: (1)利用Tomcat自动部署 (2)利用控制台进行部署 (3)增加自定义的Web部署文件(%Tomcat_Home%\conf\Cat ...

  7. Calendar代替Date常用方法小记

    业务逻辑中遇到日期的相关操作,整理一下小做总结 日期操作离不开 java.util.Calendar 和 java.util.Date ,实体类中日期字段设计也可能用到java.sql.Date.但目 ...

  8. Go指针相关

    结合这个例子分析一下 结果: 结合以往C语言的基础,画了一张图来解释为什么会有上面这些值的出现.先查看下Go中的这两个运算符是啥吧. ①对于所有带a的结果 var a int = 1 定义了一个变量a ...

  9. Asteroids POJ - 3041 匈牙利算法+最小点覆盖König定理

    题意: 给出一个N*N的地图N   地图里面有K个障碍     你每次可以选择一条直线 消除这条直线上的所有障碍  (直线只能和列和行平行) 问最少要消除几次 题解: 如果(x,y)上有一个障碍 则把 ...

  10. Matplotlib学习---用seaborn画矩阵图(pair plot)

    矩阵图非常有用,人们经常用它来查看多个变量之间的联系. 下面用著名的鸢尾花数据来画一个矩阵图.从sklearn导入鸢尾花数据,然后将其转换成pandas的DataFrame类型,最后用seaborn画 ...