issubclass和isinstance

  • issubclass:可以判断一个类是否另一个类的子类。
# issubclass

class A:
pass class B(A):
pass class C(B):
pass print(issubclass(B, A))
print(issubclass(C, B))
print(issubclass(C, A)) # 结果:
# True
# True
# True
  • type:然后我们来看type. type在前⾯的学习期间已经使⽤过了. type(obj) 表⽰查看obj是由哪个类创建的
  • isinstance:判断一个对象是否是某个类的实例
class Foo:
pass
obj = Foo()
print(obj, type(obj)) # 查看obj是由那个类创建的

我们再来看一个加法函数函数:

# type和issubclass

# 定义一个函数,计算两个数的和
def cal(a, b):
if (type(a) == int or type(b) == float) and (type(b) == int or type(b) == float):
return a + b
else: # 这路先进行了类型的判断,如果不是int或者是float类型的则不进行计算
return '不能帮你计算' print(cal(10, 20))
print(cal(10, '胡辣汤')) # 结果:
# 30
# 不能帮你计算

像这种处理可以使用isinstance来处理,isinstance咳哟判断一个对象是否是一个类的实例或者是其父类的实例:

def cal (a, b):
if isinstance(a, (int, float)) and isinstance(b, (int, float)):
return a + b
else:
return '不能帮你计算' print(cal(10.3, 20))
print(cal(10, '胡辣汤')) # 结果:
# 30.3
# 不能帮你计算

总结一下:

内置函数 描述及使用场景 使用方法
issubclass 判断一个类是否是另一个类的子类 issubclass(cls, class_or_tuple)
type 查看一个对象的具体类型,不会查找父类 type(obj)
isinstance 判断一个对象是否是某个对象的实例,但是isinstance没有type那么精准,他会向上查找父类 isinstance(obj, class_or_tuple)

区分函数和方法

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
  • 类⽅法. 不论任何情况, 都是⽅法.
  • 静态⽅法, 不论任何情况. 都是函数.
  • 实例⽅法, 如果是实例访问. 就是⽅法. 如果是类名访问就是函数.

反射

关于反射, 其实⼀共有4个函数:

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

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

setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这⾥的value可以是值, 也可以是函数或者⽅法

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

  • hasattr:判断某个对象中是否存在指定的属性或者方法
  • getattr:获取某个对象中指定的方法
hasattr(obj, name, /)
Return whether the object has an attribute with the given name. This is done by calling getattr(obj, name) and catching AttributeError. setattr(obj, name, value, /)
Sets the named attribute on the given object to the specified value. setattr(x, 'y', v) is equivalent to ``x.y = v''
class Foo:
def func1(self):
print('我是func1函数') def func2(self):
print('我是func2函数') def func3(self):
print('我是func3函数') f = Foo() fn = input('请输入你要测试的函数:')
if hasattr(f, fn): # 先判断f中是否有fn属性
func = getattr(f, fn) # 确认有这个属性在从对象中获取这个属性
func()
else:
print('没有这个功能') # 结果:
# 请输入你要测试的函数:func1
# 我是func1函数
  • setattr:设置某个对象的属性(变量或者是方法)
setattr(f, 'func3', lambda:print('我是自定义函数'))         # 设置自定义方法
f.func3() setattr(f, 'name', 'zzc') # 设置自定义属性
print(f.name) # 结果:
# 我是自定义函数
# zzc
  • delattr:删除对象中指定的属性
delattr(Foo, 'func2')
f.func2() # 此时Foo中的func2方法已经被删除了,这里执行会抛出异常 ---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-dd69df692558> in <module>
----> 1 f.func2() AttributeError: 'Foo' object has no attribute 'func2'

python学习笔记:第18天 面向对象04-反射的更多相关文章

  1. python学习笔记-(十)面向对象基础

    面向对象相关知识简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

  2. python学习笔记-(十一)面向对象进阶&异常处理

    上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用). 静态方法 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使 ...

  3. python学习笔记(四)——面向对象编程

    python 支持面向过程编程和面向对象编程. 传统面向过程编程,也叫函数式编程,通过我们的需求设计成一个一个的函数来完成,对一些小规模程序来说面向过程确实简单方便不少.而随着互联网的发展,对于一些大 ...

  4. Python实用笔记 (18)面向对象编程——类和实例

    类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各 ...

  5. python学习笔记(18)--eclipse更换主题

    说明: 1. 在eclipse marketplace 搜索color ide pack安装 2. 参考文章和评论http://blog.csdn.net/wusuopubupt/article/de ...

  6. python学习笔记(18)字典和json 的区别 和转换

    字典和json 的区别 和转换 前言:字典和json非常像.接下来比较一下两者的异同 先看一下字典的写法: a = {'a':'1', 'b':'2', 'c':'3' } 再看一下json的写法: ...

  7. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  8. Python学习笔记:装饰器

    Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...

  9. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

  10. Python 学习笔记(下)

    Python 学习笔记(下) 这份笔记是我在系统地学习python时记录的,它不能算是一份完整的参考,但里面大都是我觉得比较重要的地方. 目录 Python 学习笔记(下) 函数设计与使用 形参与实参 ...

随机推荐

  1. 超详细Redis入门教程【转】

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下   [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...

  2. Spring学习总结之---装配Bean

    Spring配置的可选方案 前言:Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,作为开发人员,你需要告诉Spring容器要创建那些Bean,以哪种方式创建,并且如何将 ...

  3. 文本处理三剑客之 Sed ——高级编辑命令

    本篇介绍sed的高级编辑命令 高级编辑命令 P:打印模式空间开端至\n内容,并追加到默认输出之前 n: 读取匹配到的行的下一行覆盖至模式空间 N:读取匹配到的行的下一行追加至模式空间 h: 把模式空间 ...

  4. Pinball Save Earth 正式上线

    有问题或者建议大家可以联系我的QQ 914287516 或者qq邮箱 官方qq群 325631077:

  5. C#图解教程读书笔记(第8章 表达式和运算符)

    表达式 字面量 整数字面量 字符字面量 字符串字面量 求值顺序 优先级 结合性 与C和C++不同,在C#中的数字不具有布尔意义. 各种运算符的作用(过) 用户定义类型转换 class XiXiInt ...

  6. React Native for Android on Windows 配置开发安装总结

    配置开发安装总结(由于当前react-native更新较快,目前是针对2015年11月底时的reacti-native android for windows版本,有些内容可能过时) 官方的安装指导在 ...

  7. Codeforces Round #433 (Div. 2)【A、B、C、D题】

    题目链接:Codeforces Round #433 (Div. 2) codeforces 854 A. Fraction[水] 题意:已知分子与分母的和,求分子小于分母的 最大的最简分数. #in ...

  8. hdu5194 DZY Loves Balls 【概率论 or 搜索】

    //yy:那天考完概率论,上网无聊搜个期望可加性就搜到这题,看到以后特别有亲和感,挺有意思的. hdu5194 DZY Loves Balls [概率论 or 搜索] 题意: 一个盒子里有n个黑球和m ...

  9. BZOJ3940:[USACO]Censoring(AC自动机,栈)

    Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...

  10. PHP基础系列(二) PHP数组相关的函数分类整理

    之前写过一篇介绍 PHP字符串函数 的博文,这里写第二篇,本文主要介绍PHP 数组相关的函数: 一.检查数组中是否存在 array_key_exists — 检查给定的键名或索引是否存在于数组中 ar ...