14 isinstance type issubclass及反射

一 isinstance() 、type()、 issubclass()

  • issubclass(xxx,ooo)内置函数可以帮我们判断类xxx类是不是ooo类的子类。

class AAA:
    pass
class BBB(AAA):
    pass
class CCC(BBB):
    pass
print(issubclass(BBB,AAA)) #True
print(issubclass(AAA,BBB))#False
print(issubclass(CCC,AAA)) #True 可以隔代检测

issubclass

  • type(obj) 查看obj是由哪个类创建的。

type

  • isinstance(xxx,ooo)判断xxx的数据类型是不是ooo,或者判断xxx()对象是不是在ooo类下,只能向上判断。

class AAA:
    pass
class BBB(AAA):
    pass
class CCC(BBB):
    pass
num = 3
print(isinstance(BBB(),AAA)) #True
print(isinstance(AAA(),BBB))#False
print(isinstance(CCC(),AAA)) #True 可以隔代检测
print(isinstance(num,int))#True

isinstance

二、区分函数和方法

  1 首先看一个函数和方法

def pao():
    print(‘跑得快‘)
class Tiao:
    def tiao(self):
        print(‘跳得高‘)
t = Tiao()
print(pao)#<function pao at 0x036F7F18>
print(t.tiao)#<bound method Tiao.tiao of <__main__.Tiao object at 0x036F6A70>>

 打印出他们的函数名明显可以看到function和method是不是意味着就这样就可以区分了呢,其实不然。继续看下面的代码。

    在这之前需要了解两个概念:

            1.所有的?法都是MethodType的实例

            2.所有的函数都是FunctionType的实例

判断函数和方法

from types import MethodType, FunctionType
def func():
    pass
print(isinstance(func, FunctionType))   # True
print(isinstance(func, MethodType))     # False
class Foo:
    def chi(self):
        print("我是吃")
    @staticmethod
    def static_method():
        pass
    @classmethod
    def class_method(cls):
        pass
obj = Foo()
print(type(obj.chi))    # method
print(type(Foo.chi))    # function
print(isinstance(obj.chi, MethodType))  # True
print(isinstance(Foo.chi, FunctionType))    # True
print(isinstance(Foo.static_method, FunctionType))    # True
print(isinstance(Foo.static_method, MethodType))    # False
print(isinstance(Foo.class_method, FunctionType))    # False
print(isinstance(Foo.class_method, MethodType))    # True

由以上可以总结出:

  1. 类?法. 不论任何情况, 都是?法.(类其实也是对象)

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

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

三 、反射

    如果一个人写了一个项目的代码需要你去测试他写的每一个函数功能,此时我们就可以利用反射的原理去进行检测,正常情况下是先导入模块再去使用模块里面的内容,现在我们需要反着来使用,先导入模块再输入我们需要执行的功能再去模块里面找然后实现。

步骤:1.首先是导入源代码的模块

   2.利用 hasattr(obj, str)、getattr(obj,str) 、setattr(obj, str, value)、delattr(obj, str)这四个函数去操作。

#源代码(jiance)
def suan():
    print(‘算不出‘)
z = ‘刘杰‘
a = ‘laal‘
import jiance

while 1: #逐一检测
    s = input(‘输入你要测试的功能:‘)
    if hasattr(jiance,s):#检测你输入的函数是否在原模块内
        f = getattr(jiance,s)# 如果原模块有就返回该函数的地址
        f()#执行该函数 #算不出
    else:
         print(‘没有这个功能‘)

-------------------------------------------------------------------------
#在内存中修改或者添加变量或函数
def suan1():
    print(‘我要吃饭‘)
setattr(jiance,‘suan1‘,suan1)#如果需要更改原模块的函数或者添加函数,使用此函数
if hasattr(jiance,‘suan1‘):#此刻实现的功能就是在内存中添加了suan1函数
    f = getattr(jiance,‘suan1‘)#如果更改的就将函数名改为和原模块函数名相同就可以了
    f()#我要吃饭
#同样还可以修改和添加变量
setattr(jiance,‘a‘,‘哎呀‘)
c = getattr(jiance,‘a‘)
print(c)# 哎呀
print(jiance.a) #哎呀
delattr(jiance,‘z‘)#删除变量print(jiance.z)#找不到

class Car:
    def __init__(self,name,color,price):
        self.name = name
        self.color = color
        self.price = price
    def fly(self):
        print(‘我会飞‘)
c=Car(‘红旗‘,‘黑色‘,‘12000‘)
c2=Car(‘很多‘,‘asd‘,‘2222‘)
c.fly()
setattr(Car,‘fly‘,lambda self:print(‘我还会跳‘))#更改类中方法
c.fly()#我还会跳
print(c.color)
setattr(c,‘color‘,‘红色‘)#更改属性
print(c.color)#红色
delattr(Car,‘fly‘)#删除方法
print(c.price)
c2.fly()#删除了方法,无法访问

在类中的使用

四、MD5加密

  md5加密是不可逆的。

import hashlib
# r = b‘ldk55451254adha‘
r2 = bytes(‘卡卡‘.encode(‘utf8‘))
obj =  hashlib.md5(r2)#可以加一段
obj.update(‘983212‘.encode(‘utf8‘))
miwen = obj.hexdigest()
print(miwen)#7abce2520806c381fb696115cc71788a

  

原文地址:https://www.cnblogs.com/-0121/p/9936742.html

时间: 2024-08-02 13:17:44

14 isinstance type issubclass及反射的相关文章

27 isinstance与issubclass、反射、内置方法

isinstance与issubclass issubclass:判断子类是否属于父类,是则返回True,否则返回False isinstance:判断对象是否属于类,是则返回True,否则返回False class Bar: pass class Foo(Bar): pass print(issubclass(Foo,Bar))#输出一个True obj=Foo() print(isinstance(obj,Foo))#输出一个True 反射 反射:通过字符串来反射/映射到对象/类的属性上 c

isinstance type issubclass

class Animal: def eat(self): print("刚睡醒吃点儿东西") class Cat(Animal): def play(self): print("猫喜欢玩儿") c = Cat() print(isinstance(c, Cat)) # c是一只猫 print(isinstance(c, Animal)) # 向上判断 a = Animal() print(isinstance(a, Cat)) # 不能向下判断 print(type

爱根,征服我的一天[isinstance,issubclass]、反射、内置attr,定制自己的数据类型

今日重点: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 isinstance,issubclass # isinstance(obj,cls)检查是否obj是否是类 cls 的对象. # issubclass(sub,super)检查sub类是否是 super 类的派生类. class Peop

绑定与非绑定方法及反射,isinstance和issubclass内置函数

目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射 反射定义 4个可以实现反省的函数(内置函数) 反射使用场景 绑定方法与非绑定方法 1.绑定方法 ? 绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数传入 ? ? 绑定给对象的方法: ? 类中定义的函数默认就是绑定给对象的 ? 绑定给类的方法: ? 为类中定义的函数加上一个装饰器cla

isinstance 与 issubclass

isinstance与issubclass都是用于判断的,有什么区别呢? 1. isinstance字面意思:实列, 用户判断对象所属类型,包含类的继承关系. 2. issubclass字面理解:是子类. 用来判断类与类之间的关系, 含继承关系 列: class A: pass class B(A): pass b= B() print( isinstance(b,B))   结果为True print( isinstance(b,A))   结果为True print( issubclass(

python ==》 面向对象的反射,(isinstance and issubclass)

1.staticmethod:(静态方法) 静态方法:让类里的方法直接被类调用,就像正常的函数一样. class Staticmethod_Demo(): role = 'Aray' @staticmethod def func(): print('当普通方法用') Staticmethod_Demo.func() 输出结果: 当普通方法用 2.classmethod:(类方法) 类方法:默认参数为:cls  ,可以直接用类名调用,可以与类属性交互. class Classmethod_Demo

isinstance 和 issubclass

isinstance(obj,cls):检查obj是不是cls的对象(传两个参数,一个是对象,一个是类) issubclass(sub,super):检查sub是不是super的子类(传两个参数,一个是子类,一个是父类) #!/usr/bin/env python # -*- coding:utf-8 -*- print(isinstance(1,int)) #True #判断 1 是不是int类型 class Foo: pass class Son(Foo): pass s = Son() p

内置函数isinstance和issubclass

1. isinstance(obj,class) 判断对象obj是不是由class生成的对象. class Foo: pass obj=Foo() print(isinstance(obj,Foo)) obj是Foo的生成的对象,返回True.如果不是,则返回False. d={'x':1} #d=dict({'x':1} #) print(type(d) is dict) print(isinstance(d,dict))# 判断对象d是不是类dict生成的 issubclass() 2.is

property装饰器函数 @classmethod @staticmethod isinstance和issubclass

property函数   让方法伪装成属性   还有一系列的装饰器函数 1 class Goods: 2 __discount = 0.8 3 def __init__(self,price): 4 self.__price = price 5 self.name = 'apple' 6 7 @property #伪装成属性 8 def price(self): 9 return self.__price * Goods.__discount 10 11 @price.setter #修改折扣