返回顶部
首页 > 资讯 > 后端开发 > Python >python学习 day018打卡 反射
  • 315
分享到

python学习 day018打卡 反射

反射python 2023-01-30 22:01:20 315人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

本节主要内容: 1.isinstance,type,issubclass 2.区分函数和方法 3.反射(重点)   一.isinstance,type,issubclass issubclass():判断xxx类是否是yyy类型的子类

本节主要内容:

1.isinstance,type,issubclass

2.区分函数和方法

3.反射(重点)

 

一.isinstance,type,issubclass

issubclass():判断xxx类是否是yyy类型的子类

class Base:
    pass

class Foo(Base):
    pass

class Bar(Foo):
    pass

print(issubclass(Bar,Foo))  # True
print(issubclass(Foo,Bar))  # False
print(issubclass(Bar,Base)) # Ture

type(obj):查看obj是由哪个类创建的.

class Foo:
    pass

obj = Foo()
print(type(obj))    # <class '__main__.Foo'>

type()可以帮我们判断xxx是否是xxx数据类型的

class Boy:
    pass

class Girl:
    pass

# 统计传进来的男生和女生分别有多少
def func(*args):
    b=0
    g=0
    for obj in args:
        if  type(obj) == Boy:
            b+=1
        elif type(obj) == Girl:
            g += 1
    return b,g

ret = func(Boy(),Girl(),Boy(),Girl(),Boy(),Girl(),Boy())
print(ret)

 

 isinstance() 也可以判断xxx是否是xxx类型的数据,但是isinstance没有issubclass() 那么精准.

class Base:
    pass

class Foo(Base):
    pass

class Bar(Foo):
    pass

print(isinstance(Bar,Foo))  # True
print(isinstance(Foo,Bar))  # False
print(isinstance(Bar,Base)) # False

 

isinstance可以判断该对象是否是xxx家族体系中的(只能往上判断)

 

二,区分函数和方法

def func():
    pass

print(func) #<function func at 0x00000265B9E12E18>

class Foo:
    def chi(self):
        print("我是吃")

foo = Foo()
print(foo.chi)  # <bound method Foo.chi of <__main__.Foo object at 0x00000265BA00C908>>

  函数在打印的时候,很明显显示的是function.而方法在打印的时候很明显是method.但是在类里面就不一定了:

class Foo:

    def chi(self):
        print("我是吃")

    @staticmethod
    def static_method():
        pass

    @claSSMethod
    def class_method(cls):
        pass
    
f = Foo()
print(f.chi)    # <bound method Foo.chi of <__main__.Foo object at 0x0000016B23AEC978>>
print(Foo.chi)  # <function Foo.chi at 0x0000016B23ACDF28>
print(Foo.static_method)    # <function Foo.static_method at 0x0000016B23AF4048>
print(Foo.class_method) # <bound method Foo.class_method of <class '__main__.Foo'>>
print(f.static_method)  # <function Foo.static_method at 0x0000016B23AF4048>
print(f.class_method)   # <bound method Foo.class_method of <class '__main__.Foo'>>

 

通过观察上面代码的结果,我们可以得出以下结论:

1.类方法.不论任何情况,都是方法.

2.静态方法,不论任何情况,都是函数.

3.实例方法,如果是对象去访问,就是方法.如果是类名访问就是函数.

 

我们可以通过借助types模块来帮我们分辨到底谁是函数,谁方法

from types import FunctionType, MethodType

class Car:
    def run(self): # 实例方法
        print("我是车, 我会跑")

    @staticmethod
    def cul():
        print("我会计算")

    @classmethod
    def jump(cls):
        print("我会jump")


# 实例方法:
#     1. 用对象.方法   方法
#     2. 类名.方法     函数
c = Car()
# print(isinstance(c.run, FunctionType)) # False
# print(isinstance(Car.run, FunctionType)) # True
# print(isinstance(c.run, MethodType)) # True
# print(isinstance(Car.run, MethodType)) # False

# 静态方法 都是函数
# print(isinstance(c.cul, FunctionType)) # True
# print(isinstance(Car.cul, FunctionType)) # True
# print(isinstance(c.cul, MethodType)) # False
# print(isinstance(Car.cul, MethodType)) # False

# 类方法都是方法
print(isinstance(c.jump, FunctionType)) # False
print(isinstance(Car.jump, FunctionType)) # False
print(isinstance(c.jump, MethodType)) # True
print(isinstance(Car.jump, MethodType)) # True

# FunctionType:函数
# MethodType: 方法

 

插入: 我们写的类也可以看做是对象,类的类型是type,即type(类) ==><class 'type'>

 

三.反射

反射:所谓反射就是通过字符串来动态访问模块中的功能.通过手动输入需要运行的功能,反着去模块里找,这个就叫反射

# master.py

def chi():
    print("大牛很能吃")

def he():
    print("大牛从来不喝")


def la():
    print("大牛就知道拉")

def sa():
    print("大牛说撒是什么")
import master

while True:
    s = input("请输入你要测试的功能:")

    if hasattr(master,s):
        func = getattr(master,s)
        func()
    else:
        print("你输入的是个啥玩意儿啊")

 

里面涉及到的两个函数---getattr(), hasattr()

getattr()用来获取信息

hasattr()用来判断xxx中是否包含了xxx功能.

class Person:
    country = "大清"
    def chi(self):
        pass

# 类中的内容可以这样动态获取
print(getattr(Person,"country"))
print(getattr(Person,"chi"))    # 相当于Foo.func 函数

# 对象一样可以
obj = Person()
print(getattr(obj,"country"))
print(getattr(obj,"chi"))   # 相当于obj.func 方法

 总结,getattr()可以从模块中获取内容,也可以从类中获取内容,也可以从对象中获取内容.在python中一切皆为对象,那可以这样认为.getattr从对象中动态的获取成员

 

关于反射,一共有4个函数:

1.hasattr(obj,str)判断obj中是否包含str成员

2.getattr(obj,str)从obj中获取str成员

3.setattr(obj,str,value)吧obj中的str成员设置成value.注意,这里的value可以是值,也可以是函数或者方法.如果str不存在,就创建新的成员,把值赋值给新成员

4.delattr(obj,str)把obj中的str成员删除掉

 

注意,以上操作都是在内存中进行的,并不会影响你的源代码

class Foo:
    pass

f = Foo()
print(hasattr(f,"chi")) # False

setattr(f,"chi","123")
print(f.chi) # 被添加了一个属性信息

setattr(f,"chi",lambda x :x+1)
print(f.chi(3)) # 4
print(f.chi) # 此时的chi既不是静态方法,也不是实例方法,更不是类方法.就相当于你在类中写了个self.chi = lambda 是一样的
print(f.__dict__)   # {'chi': <function <lambda> at 0x00000238E1392E18>}

delattr(f,"chi")
print(hasattr(f,"chi")) # False

 

--结束END--

本文标题: python学习 day018打卡 反射

本文链接: https://lsjlt.com/news/180189.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python学习 day018打卡 反射
    本节主要内容: 1.isinstance,type,issubclass 2.区分函数和方法 3.反射(重点)   一.isinstance,type,issubclass issubclass():判断xxx类是否是yyy类型的子类 ...
    99+
    2023-01-30
    反射 python
  • python学习之反射
    python学习反射实例1脚本内容如下:#coding: utf8class myClass(object):    def fax(self):        print 'faxing....'    def copy(self):  ...
    99+
    2023-01-31
    反射 python
  • Python学习 day01打卡
    1.Python : 是一门解释型 弱类型 高级开发编程语言. 2.第一个Python程序的编写: print ("hell,world") 3.变量:把程序运行过程中的值储存起来,方便后面的程序调用. 4.变量的命名要求: 1,只能是数...
    99+
    2023-01-30
    Python
  • Python学习 :反射 & 单例模式
     反射   什么是反射?   - 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)   面向对象中的反射   - 通过字符串的形式来操作(获取、检查、增加、删除)对象中的成员   - python中的一切事物都是对象...
    99+
    2023-01-31
    反射 模式 Python
  • python3学习之反射
    1、反射  用于方法调用 利用字符串的形式去对象中操作成员(增/删/查),注意仅是在内存中操作 #hasattr(模块,'字符串'): 判断有没有 ,模块中有没有“字符串”为名字的成员;   返还True或者False #getattr(模...
    99+
    2023-01-31
    反射
  • JavaScript 反射学习技巧
    目录1、前言2、接口3、简单的例子4、结语1、前言 根据 MDN 官网解释: Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与 proxy ...
    99+
    2024-04-02
  • python学习 day017打卡 类与
    本节主要的内容: 1.依赖关系 2.关联关系,组合关系,聚合关系 3.继承关系,self到底是什么 4.类中的特殊成员   一.类与类之间的依赖关系 在面向对象的世界中,类与类中存在以下关系: 1.依赖关系 2.关联关系 3.组合关系 4...
    99+
    2023-01-30
    python
  • Python基础学习之反射机制详解
    目录什么是反射应用场景基本小栗子贴近实际应用的小场景什么是反射 在Python中,反射是指通过一组内置的函数和语句,在运行时动态地访问、检查和修改对象的属性、方法和类信息的机制。Py...
    99+
    2023-03-22
    Python反射机制 Python反射
  • Java反射机制的学习总结
    一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。 二、哪里用到反射机制 有些...
    99+
    2022-11-15
    Java 反射机制
  • Java学习教程:Java基础——反射
    什么是反射?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。例如:我们在开发的过程当中,...
    99+
    2023-06-03
  • Java中反射的学习笔记分享
    目录简介一个简单的例子设置使用反射模拟instanceof运算了解类的方法获取有关构造函数的信息查找类字段按名称调用方法创建新对象更改字段的值使用数组总结简介 反射是Java编程语言...
    99+
    2022-11-13
    Java 反射
  • Java高级语法学习之反射详解
    目录一、什么是反射二、准备测试:实体类的创建三、反射中的几个重要类及方法(一)反射中的重要类之Class(二)反射中的重要类之Field(三)反射中的重要类之Constructor(...
    99+
    2024-04-02
  • Go语言学习之反射的用法详解
    目录1. reflect 包1.1 获取变量类型1.2 断言处理类型转换2. ValueOf2.1 获取变量值2.2 类型转换3. Value.Set3.1 设置变量值3.2 示例4...
    99+
    2024-04-02
  • Golang学习之反射机制的用法详解
    目录介绍TypeOf() ValueOf()获取接口变量信息事先知道原有类型的时候事先不知道原有类型的时候介绍 反射的本质就是在程序运行的时候,获取对象的类型信息和内存结构,反射是把...
    99+
    2024-04-02
  • 机器学习——信用卡反欺诈案例
    导入类库 1 import numpy as np 2 import pandas as pd 3 from pandas import Series, DataFrame 4 import matplotlib.pyplot ...
    99+
    2023-01-30
    信用卡 机器 案例
  • Java基础学习之反射机制原理详解
    目录一、什么是反射二、反射的原理三、反射的优缺点四、反射的用途五、反射机制常用的类六、反射的基本使用一、什么是反射 (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细...
    99+
    2024-04-02
  • Golang语言学习拿捏Go反射示例教程
    目录1. 反射简介1.1 反射是什么?1.2 为什么需要反射?2. reflect包2.1 基本反射2.2 反射与指针2.3 反射与对象2.4 反射与函数2.5 反射例子3. 总结1...
    99+
    2024-04-02
  • Go语言学习教程之反射的示例详解
    目录介绍反射的规律1. 从接口值到反射对象的反射2. 从反射对象到接口值的反射3. 要修改反射对象,该值一定是可设置的介绍 reflect包实现运行时反射,允许一个程序操作任何类型...
    99+
    2024-04-02
  • 学习Go语言文档中的reflect.Value.Interface函数实现值反射
    学习Go语言文档中的reflect.Value.Interface函数实现值反射,需要具体代码示例在Go语言中,reflect包提供了一系列函数来进行类型的反射操作,其中reflect.Value结构体是reflect包中的一个重要组成部分...
    99+
    2023-11-04
    反射 关键词:Go语言 reflectValueInterface函数
  • Python光学仿真学习衍射算法初步理解
    对衍射最经典的解释是Huygens-Fresnel原理,Huygens认为波阵面上每一点都会成为新的波源,这些子波源的相互干涉就形成了衍射。这显然是一种离散的观点,仿佛是专门为程序员...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作