1.  isinstance,   type,   issubclass

isinstance(): 判断你给的xxx对象是否是xxxxx类型的,只支持向上判断

isinstance(object, classinfo)

type():返回xxx对象的数据类型

type(object)
type(name, bases, dict)

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

class Animal:
def eat(self):
print("刚睡醒吃点儿东西") class Cat(Animal):
def play(self):
print("猫喜欢玩儿") # isinstance
c = Cat()
print(isinstance(c, Cat)) # c是一只猫
print(isinstance(c, Animal)) # 向上判断 a = Animal()
print(isinstance(a, Cat)) # 不能向下判断 # type
print(type(a)) # 返回 a的数据类型
print(type([]))
print(type(c)) # 精准的告诉你这个对象的数据类型 #issubclass
# 判断.xx类是否是xxxx类的子类
print(issubclass(Cat, Animal))
print(issubclass(Animal, Cat)) # 应用
def cul(a, b): # 此函数用来计算数字a和数字b的相加的结果
# 判断传递进来的对象必须是数字. int float
if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
return a + b
else:
print("对不起. 您提供的数据无法进行计算") print(cul(a, c))

  

2.区分方法(Method)和函数(Function)

类:

  实例方法: 类型.方法 就是函数.  对象.方法 就是 方法

低级版的判定:

def func():
print("我是函数") class Foo:
def chi(self):
print("我是吃") # print(func) # <function func at 0x0000000001D42E18>
f = Foo()
# f.chi() print(f.chi) # <bound method Foo.chi of <__main__.Foo object at 0x0000000002894A90>> # 打印的结果中包含了function. 函数
# method . 方法

类方法: 都是方法

我们的类也是对象.
这个对象: 属性就是类变量
方法就是类方法
class Person:
def chi(self):
print("我要吃鱼") @classmethod
def he(cls):
print("我是类方法") @staticmethod
def pi():
print("泥溪镇地皮") p = Person()
Person.chi(1) # 不符合面向对象的思维 print(p.chi) # <bound method Person.chi of <__main__.Person object at 0x00000000028C4B70>>
print(Person.chi) # <function Person.chi at 0x00000000028989D8> 实例方法:
1. 如果使用 对象.实例方法 方法
2. 如果使用 类.实例方法 函数 print(Person.he) # <bound method Person.he of <class '__main__.Person'>>
print(p.he) # <bound method Person.he of <class '__main__.Person'>> 类方法都是 方法
print(Person.pi) # <function Person.pi at 0x0000000009E7F488>
print(p.pi) # <function Person.pi at 0x0000000009E7F488> 静态方法都是函数

 

高级版的判定

from types import FunctionType, MethodType # 方法和函数

class Person:
def chi(self): # 实例方法
print("我要吃鱼") @classmethod
def he(cls):
print("我是类方法") @staticmethod
def pi():
print("静态方法")
p = Person() print(isinstance(Person.chi, FunctionType)) # True
print(isinstance(p.chi, MethodType)) # True print(isinstance(p.he, MethodType)) # True
print(isinstance(Person.he, MethodType)) # True print(isinstance(p.pi, FunctionType)) # True
print(isinstance(Person.pi, FunctionType)) # True

  

3.反射

  程序可以访问,检测和修改它本身状态或行为的一中能力(自省)好处可以实现定义好忌口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种后期绑定

一共用到四个函数

attr: attitude 属性的意思

getattr(obj,str)  从xxx对象中获取到xxx属性值

getattr(object, name[, default])

hasattr(obj,str) 判断xxx对象中是否有xxx属性值

hasattr(object, name)

delattr(obj,str) 从xxx对象中删除xxx属性

delattr(object, name)

setattr(obj,str,value)  设置xxx对象中的xxx属性为xxx值

setattr(object, name, value)

对于模块而言可以使用getattr, hasattr, 同样对于我们的对象也可以执行类似的操作

class Person:
def __init__(self, name, laopo):
self.name = name
self.laopo = laopo p = Person("宝宝", "林志玲") print(hasattr(p, "laopo")) #
print(getattr(p, "laopo")) # p.laopo setattr(p, "laopo", "胡一菲") # p.laopo = 胡一菲
setattr(p, "money", 100000000000) # p.money = 100000000 print(p.laopo)
print(p.money) delattr(p, "laopo") # 把对象中的xxx属性移除. != p.laopo = None
print(p.laopo)

  

python--区分函数和方法, 反射的更多相关文章

  1. python --- 19 判断对象所属,区分函数和对象, 反射

    一.判断对象所属 isinstance, type , issubclass 1.issubclass(x,y)    判断x是否是y 的子类 2.type(x)  精准返回x 的数据类型 3.isi ...

  2. python requests函数封装方法

    python  requests函数封装方法 上代码 import requests import json """ 封装request请求, 1.post:my_pos ...

  3. python基础函数、方法

    python的函数和方法,通过def 定义: 函数的特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 函数和方法的区别:函数有返回值.方法没有 语法定义: def sayhi():#函数名 p ...

  4. Python列表函数和方法

    Python列表函数和方法: 函数: len(列表名): 返回列表长度 # len(列表名): # 返回列表长度 lst = [1,2,3,'a','b','c'] print("lst 列 ...

  5. python之面向对象函数与方法,反射,双下方法

    一.函数和方法 1.函数和方法的区别 函数: 全都是显性传参,手动传参,与对象无关 方法: 存在隐性传参,与对象有关 1.1通过函数名可以判断 len()就是函数 str.count()就是方法 de ...

  6. python常用函数和方法 - 备忘

    语法语句篇 除法运算(精确运算和截断运算) 在python2中,除法运算通常是截断除法.什么是截断除法: >>> 3/4 0 # 自动忽略小数项 要是想 得到正确结果 怎么办呢? m ...

  7. python中函数与方法的区别

    在python中,其实函数和方法的区别取决于其调用者,在普通的函数定义中就叫做函数 例如: def func(): print('这是一个函数') 而在一个类中定义时,就将其分为两种情况 第一种:被称 ...

  8. Python | Python常用函数、方法示例总结(API)

    目录 前言 1. 运算相关 2. Sring与数字 3. 列表相关 4. 集合相关 5. 序列化类型 6. 字典相关 7. 输入输出 8. 文件相关 9. json模块 10. unittest测试模 ...

  9. Python中函数和方法的区别

    方法是一种特殊的函数属于某个类的的函数叫方法不属于某个类的函数叫函数 转自csdn https://blog.csdn.net/weixin_40380298/article/details/7825 ...

随机推荐

  1. leetcode112

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  2. 按键精灵对VBS的支持

    VBSBegin…VBSEnd(VBS块)格式:VBSBegin...VBSEnd用途:可以在VBS块的区域内随意的书写VBS语法指令. 更多说明:由于彻底的转向VBS语言,会导致goto语句不能被兼 ...

  3. 获取当前函数名 __FUNCTION__ 的使用<转>

    vs项目中见过这种获取 当前函数名的调用.觉得挺方便的就记录一下. ============================================================== 转载地 ...

  4. LUA中相同签名函数覆盖

    function test() print('test')end function test() print('test22222')end test() --输出test2222

  5. partial function

    [partial function] functools.partial(func[,*args][, **keywords]) Return a new partial object which w ...

  6. 九度oj-1533 最长上升子序列 (LIS)

    http://ac.jobdu.com/problem.php?pid=1533 题目描述: 给定一个整型数组, 求这个数组的最长严格递增子序列的长度. 譬如序列1 2 2 4 3 的最长严格递增子序 ...

  7. 自定义对象实现copy,遵守协议<NSCopying, NSMutableCopying>

    自定义对象实现copy,步骤 1.需要遵守NSCopying协议 2.实现协议中的- (id)copyWithZone:(NSZone *)zone 3.在- (id)copyWithZone:(NS ...

  8. springboot中端点监管 endpoint actuator

    1.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  9. 3D 点云特征

    博客参考: https://blog.csdn.net/shaozhenghan/article/details/81346585 和 https://www.cnblogs.com/li-yao77 ...

  10. JAVA里的CAS算法简析

    Atomic 从JDK5开始, java.util.concurrent包里提供了很多面向并发编程的类. 使用这些类在多核CPU的机器上会有比较好的性能.主要原因是这些类里面大多使用(失败-重试方式的 ...