day17 isinstance type issubclass 反射
1. issubclass,type,isinstance
1.issubclass 判断xxx是否yyy的子类
例:
class Foo:
pass
class Bar(Foo):
pass
class Base(Bar):
pass
print(issbuclass(Bar,Foo)) #TRUE
print(issubclass(Base,Foo)) #TRUE 可以进行隔代判断
print(issubclass(Foo,Bar)) #FALSE
print(issubclass(Foo, object)) #TRUE
print(issubclass(Bar, object)) #TRUE
print(issubclass(BASE, object)) #TRUE object是所有类的根,是面向 对象的祖宗 from collections import Iterator
lst = []
it = lst.__iter__() # list_iterator
print(isinstance(it, Iterator)) # True
2.type 帮我们判断xx数据是xxx书库类型的
例:在计算时候判断数据类型是否可以进行计算
def cul(a,b): #传入两个数a和b,计算他们的和
if(type(a)==int or type(a)==float) and (type(b)==int or type(b)==float):
return a +b
else:
return "笨蛋,文字和数字分不清"
3.isinstance 也是判断xx数据是yyy类型的,但是没有type那么精准
class Base:
pass
class Foo(Base):
pass
class Bar(Foo):
pass
print(isinstance(Foo(), Foo)) # True
print(isinstance(Foo(), Base)) # True
print(isinstance(Foo(), Bar)) # False
注:isinstance可以判断xx是xx家族体系的,但是只能往上(父类)判断,不能往下判断(子类)
2. 判断函数还是方法
例
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 at0x10f688550>>
print(Foo.chi) # <function Foo.chi at 0x10e24a488> print(Foo.static_method) # <function Foo.static_method at 0x10b5fe620>
print(f.static_method) # <function Foo.static_method at 0x10e1c0620> print(Foo.class_method) # bound method Foo.class_method of <class'__main__.Foo'>>
print(f.class_method) #<bound method Foo.class_method of <class'__main__.Foo'>>
结论:
1.实例函数
1.用类名访问是函数
2.用对象访问是方法
2.静态方法
1.不管是用对象访问还是类名访问,都是函数
3.类方法
1.不管用对象访问还是类名访问,都是方法 如何用程序判断是函数还是方法
from types import FunctionType,MethodType
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
3. 反射:手动输入要运行的功能. 反着去模块里找. 这个就叫反射
例 :
impor master #导入模块
from types import FunctionType #导入函数模块
while 1:
gongneng=input("请输入你要测试的功能")
if hasattr(master,gongneng): #判断是否存在这个功能
fn=getattr(master,gongneng) #获取这个功能
if isinstance(fn,FunctionType) 判断是否函数
fn() #是函数就运行运行这个功能
else: #不是就打印
print("fn")
class Car:
def __init__(self,color,pai,price):
self.color=color
self.pai=pai
self.price=price
def fly(self):
print("我的车会飞")
c=Car("红色","京34234",1111)
c.fly() #我的车会飞
# delattr(Car,"fly")
# c.fly() #'Car' object has no attribute 'fly'
# #方法被删掉了删除 删除方法只能通过类名
setattr(Car,"fly",lambda self:print("我的天,我的车可以打飞机"))
c.fly() #我的天,我的车可以打飞机 # print(c.color) #红色
# setattr(c,"color","黄色")
# print(c.color) #黄色 设置成了黄色,要设置属性只能去找对象 getattr(模块,字符串) 从对象中获取XX功能
可以从模块中获取功能,也可以从对象获取功能
因为在python中,一切皆为对象
hasattr()用来判断xxx中是否包含了xxx功能
setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这里的value可以是
值, 也可以是函数或者算法
delattr(obj, str) 把obj中的str成员删除掉
这几个操作都是在内存里面进行的,并不会影响你的源代码
简写:
hasattr(对象, 属性(字符串))
getattr(对象, 属性(字符串)) 从对象中获取到xxx属性 setattr(对象, 属性, 值)
delattr(对象, 属性) 从对象中删除xxx属性
4.MD5加密 不可逆加密
import hashlib
obj = hashlib.md5(加盐)
obj.update(铭文的bytes)
obj.hexdigest() 获取密文 例
import hashlib
SALT = b"abcdefghijklmnjklsfdafjklsdjfklsjdak"
def jiami(content):
obj = hashlib.md5(SALT)
obj.update(content.encode("utf-8"))
return obj.hexdigest() 注册
username = input("请输入你的用户名:")
password = input("请输入你的密码:")
password = jiami(password) 登录
username = input("请输入你的用户名:")
password = input("请输入你的密码:") if uname == username and upwd == jiami(password):
print("登录成功")
else:
print("失败")
day17 isinstance type issubclass 反射的更多相关文章
- python基础之 反射,md5加密 以及isinstance, type, issubclass内置方法的运用
内容梗概: 1. isinstance, type, issubclass 2. 区分函数和方法 3. 反射(重点) 4. md5加密 1. isinstance, type, issubclass1 ...
- isinstance/type/issubclass的用法,反射(hasattr,getattr,setattr,delattr)
6.23 自我总结 面向对象的高阶 1.isinstance/type/issubclass 1.type 显示对象的类,但是不会显示他的父类 2.isinstance 会显示的对象的类,也会去找对象 ...
- python 全栈开发,Day23(复习,isinstance和issubclass,反射)
一.复习 class A: def func1(self):pass def func2(self): pass def func3(self): pass a = A() b = A() print ...
- python基础语法17 面向对象4 多态,抽象类,鸭子类型,绑定方法classmethod与staticmethod,isinstance与issubclass,反射
多态 1.什么是多态? 多态指的是同一种类型的事物,不同的形态. 2.多态的目的: “多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字). 多 ...
- isinstance与issubclass,反射
目录 isinstance与issubclass isinstance issubclass 反射 定义 反射在模块中的应用 内置方法 isinstance与issubclass isinstance ...
- isinstance, type, issubclass
isinstance: 判断你给对象是否是xx类型的. (向上判断)type: 返回xxx对象的数据类型issubclass: 判断xxx类是否xxx的子类 class Animal: def eat ...
- day23-1 isinstance、issubclass和反射
目录 isinstance和issubclass 反射(hasattr,getattr,setattr,delattr) isinstance和issubclass isinstance(obj,cl ...
- 绑定与非绑定方法及反射,isinstance和issubclass内置函数
目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...
- python基础(28):isinstance、issubclass、type、反射
1. isinstance和issubclass 1.1 isinstance isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pa ...
随机推荐
- 封装 Toast
一. ToastView.java 1 import android.content.Context; import android.view.LayoutInflater; import andro ...
- PROCEDURE存储过程传入表参数
) ,itemNum ) ,itemQty )) ---2.创建一个存储过程以表值参数作为输入 alter proc usp_TestProcWithTable @tb LocationTa ...
- php返回文件路径
1 basename — 返回路径中的文件名部分 如果文件名为test.php,路径为www/hj/test.php echo basename($_SERVER['PHP_SELF']); 输出为: ...
- 在Oracle 12C中使用scott账号
在Oracle11g中默认是有scott账号的,但在Oracle 12C中则不能直接使用. 我的机器环境: 操作系统:Windows Server 2008 R2 64位 Oracle版本:Oracl ...
- 报错:空指针java.lang.NullPointerException 原因 Action层 private UserService userservice 上未加@Autowire注解
java.lang.NullPointerException at com.itheima.test.Test2.fun1(Test2.java:18) at sun.reflect.NativeMe ...
- Luogu 3942 将军令
之前写那个(Luogu 2279) [HNOI2003]消防局的设立的时候暴力推了一个树形dp,然后就导致这个题不太会写. 贪心,先把树建出来,然后考虑按照结点深度排个序,每次取出还没有被覆盖掉的深度 ...
- Luogu 4137 Rmq Problem / mex
一个主席树题. 一开始想着直接动态开点硬搞就可以了,每次查询只要作一个类似于前缀和的东西看看区间有没有满,在主席树上二分就可以了. 但是这样是错的,因为一个权值会出现很多次……然后就错了. 所以我们考 ...
- 函数的返回值是如何带出和接收的以及内存中的活动情况.RP
函数返回值时,要生成一个值的副本. 而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** ...
- scala中lazy
Scala中通过lazy关键字来定义惰性变量,惰性变量只能是不可变变量.只有在调用惰性变量的时候,才会去实例化这个变量
- 解决Visiual Studio2012 CLR20r3问题
解决办法: 步骤1:开始-->所有程序-->Microsoft Visual Studio 2012-->Visual Studio Tools-->VS2012 开发人员命令 ...