本节主要内容:

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","")
print(f.chi) # 被添加了一个属性信息 setattr(f,"chi",lambda x :x+1)
print(f.chi(3)) #
print(f.chi) # 此时的chi既不是静态方法,也不是实例方法,更不是类方法.就相当于你在类中写了个self.chi = lambda 是一样的
print(f.__dict__) # {'chi': <function <lambda> at 0x00000238E1392E18>} delattr(f,"chi")
print(hasattr(f,"chi")) # False

python学习 day018打卡 反射的更多相关文章

  1. python学习 day013打卡 内置函数

    本节主要内容: 内置函数: 内置函数就是python给你提供的.拿来直接用的函数,比如print,input等等.截止到python版本3.6.2 python一共提供了68个内置函数.他们就是pyt ...

  2. python学习 day09打卡 初识函数

    本节内容: 1.什么是函数 2.函数定义,函数名,函数体及函数的调用 3.函数的返回值 4.函数的参数 一.什么是函数 函数:对代码块和功能的封装和定义 定义一个事情或者功能.等到需要的时候直接去用, ...

  3. python学习 day06打卡

    今天学习的主要内容是: 一,小数据池 代码块的概念 python程序是由代码块构成的,一个代码块的文本作为python程序执行的单元. 代码块:一个模块,一个函数,一个类,甚至每一个command命令 ...

  4. Python学习 day04打卡

    今天学习的主要内容: 一,列表 1,列表的介绍 列表是python的基础数据类型之一,其他编程语音也有类似的数据类型.例如:JS 中的数组Java中的数组等等. 它是以[]括起来,每个元素用',隔开而 ...

  5. Python学习 day03打卡

    今天学习的主要内容: ppython的基本数据类型: 1. python基本数据类型回顾 2.int---数字类型 4.str---字符串类型 一.python基本数据类型 1. int==>整 ...

  6. Python学习日记(二十七) 反射和几个内置函数

    isinstance() 判断isinstance(obj,cls)中obj是否是cls类的对象 class Person: def __init__(self,name): self.name = ...

  7. python学习日记(OOP——反射)

    反射 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! hasattr ...

  8. python学习 day017打卡 类与类之间的关系

    本节主要的内容: 1.依赖关系 2.关联关系,组合关系,聚合关系 3.继承关系,self到底是什么? 4.类中的特殊成员 一.类与类之间的依赖关系 在面向对象的世界中,类与类中存在以下关系: 1.依赖 ...

  9. python学习 day016打卡 面向对象--成员

    本节主要内容: 1.类的成员 2.类的成员-变量 3.类的成员-方法 4.类的成员-属性 5.私有 一.类的成员: 能在类中写的内容就是类的成员. class 类名: #方法 def __init__ ...

随机推荐

  1. 配置开发环境2——eclipse配置

    纯手动配置eclipse, Eclipse配置 配置工作空间的编码方式 General—Workspace:改成Other:UTF-8 配置property的编码方式 配置maven Window — ...

  2. linux基础命令---显示进程ps

    ps ps指令可以显示系统中当前进程的信息,它的输出结果是高度可定制的.如果您希望重复更新所选内容和显示的信息,请使用top(1)代替. 请注意,“ps-aux”与“ps aux”不同.POSIX和U ...

  3. vue中组件通信之父子通信:props(组件传参)

    实例一: <div id="app"> <alert msg="hhhhhhh"></alert> </div> ...

  4. 一个讲课截屏 清明DAY2

    灰常混乱 放弃吧........ 不断做平方差公式 到i时,前面已经求出之前数字的逆元了 r是一个比i小的数 第四行×i,r 的逆元 BSGS 暴力枚举枚举到Φ(m)个

  5. 自写Jquery插件 Combobox

    原创文章,转载请注明出处,https://www.cnblogs.com/GaoAnLee/p/9092421.html 上效果 html <span id='combobox' class=' ...

  6. GROUP BY 和 ORDER BY 同时使用问题

    GROUP BY 和 ORDER BY一起使用时,ORDER BY要在GROUP BY的后面.

  7. Firefox创建firefoxprofile

    我们自动化测试的时候,有时不需要图片加载出来,提高浏览器加载速度,从而提高脚本的执行速度.另外在一些网络比较差的环境下,禁用css.图片等加载可以提高访问速度 方法: 1.创建自己的firefoxpr ...

  8. strpos 的正确使用方式

    首先简单介绍下strpos函数: strpos函数是查找某个字符在字符串中的位置:这里需要明确这个函数的作用: 这个函数得到的是位置:如果存在:返回数字:否则返回的是false: 而很多时候我们拿这个 ...

  9. P1297 [国家集训队]单选错位(期望)

    P1297 [国家集训队]单选错位 期望入门 我们考虑涂到第$i$道题时的情况 此时题$i$答案有$a[i]$种,我们可能涂$a[i+1]$种 分类讨论: 1.$a[i]>=a[i+1]$: 可 ...

  10. Eclipse启动参数设置

    Eclipse启动参数设置 文件路径:安装目录根路径/eclipse.ini 参数注解: [-debug options -vm javaw.exe] 显示JVM当前内存使用量(注:详见下方<让 ...