我的编程空间,编程开发者的网络收藏夹
学习永远不晚

第十八天- 类型判断 函数和方法判断 反

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

第十八天- 类型判断 函数和方法判断 反

 

# isinstance  type  issubclass 内置函数:

# 1.issubclass() 这个内置函数可判断xxx类是否是yyy类型的子类
# issubclass(子类,父类)
 1 class Base:
 2     pass
 3 
 4 class Foo(Base):
 5     pass
 6 
 7 class Bar(Foo):
 8     pass
 9 
10 print(issubclass(Bar,Foo)) # True
11 print(issubclass(Foo,Bar)) # False
12 print(issubclass(Bar,Base)) # True  可以隔代判断
View Code
1 # 补充:object是所有类的根,面向对象的祖宗
2 # print(issubclass(Foo,object))  # True
3 # print(issubclass(Bar,object))  # True
4 # print(issubclass(Base,object)) # True

 

# 2.type(xxx) 返回该对象的数据类型
1 class Foo:
2     pass
3 obj = Foo()
4 # print(obj,type(obj)) # <class '__main__.Foo'> Foo类
# type 精准的返回数据类型
1 # type 精准的返回数据类型
2 def cul(a,b):  # 计算两个参数的和(判断是否int float类)
3     if(type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
4         return a + b
5     else:
6         print("不能帮你计算")
7 
8 # print(cul(10,20))
9 # print(cul(10,"哈哈哈"))
View Code

 

# 3.isinstance 判断xxx是否是一种yyy(包括父类)
 1 class Animal:
 2     pass
 3 
 4 class Cat(Animal):  # x是一种y. x继承y
 5     pass
 6 
 7 class BosiCat(Cat):
 8     pass
 9 
10 tom = Cat()
11 print(isinstance(tom,Cat))  # True
12 print(isinstance(tom,Animal)) # True  判断tom是否是一种Animal(包括父类)
13 print(isinstance(tom,BosiCat)) # False
14 # 只能往上判断 不可往下.如.可以说猫是一种动物.但不可说猫是一种波斯猫

 

# 判断方法和函数 :
# 1.print打印方法区分
 1 class Foo:
 2     def chi(self):
 3         print("我是吃")
 4 
 5     @staticmethod
 6     def he():
 7         pass
 8 
 9     @classmethod
10     def shui(cls):
11         pass
12 
13 f = Foo()
14 print(f.chi) # 方法 <bound method Foo.chi of <__main__.Foo object at 0x000002B3F3FD3438>>
15 print(Foo.chi) # 函数 <function Foo.chi at 0x000002B3F3FC8A60>
16 print(Foo.he) # 函数 <function Foo.he at 0x0000013B49F38B70
17 print(Foo.shui) # 方法 <bound method Foo.shui of <class '__main__.Foo'>>
View Code

 

# 2.用types模块判断区分
# 所有的⽅法都是MethodType的实例
# 所有的函数都是FunctionType的实例
 1 from types import MethodType,FunctionType  # 固定开头
 2 def func():
 3     pass
 4 
 5 print(isinstance(func,FunctionType))  #  True
 6 print(isinstance(func,MethodType)) # False
 7 
 8 class Foo1:
 9     def chi(self):
10         print("我是吃")
11 
12     @staticmethod
13     def he():
14         pass
15 
16     @classmethod
17     def shui(cls):
18         pass
19 
20 test = Foo1()
21 # 实例方法
22 print(type(test.chi))  # <class 'method'>
23 print(type(Foo.chi))  # <class 'function'>
24 print(isinstance(test.chi,MethodType)) # True 对象调用时是方法
25 print(isinstance(Foo.chi,FunctionType)) # True 类调用时是函数
26 
27 # 静态方法
28 print(isinstance(Foo.he,FunctionType)) # True
29 print(isinstance(Foo.he,MethodType))  # False
30 
31 # 类方法
32 print(isinstance(Foo.shui,FunctionType)) # False
33 print(isinstance(Foo.shui,MethodType)) # True
View Code
'''
总结---
类方法:任何情况都是方法
静态方法:任何情况都是函数
实例方法:对象使用是方法,类使用是函数
'''


# 反射:
# 关于反射, ⼀共有4个函数:
# 1. hasattr(obj, str) 判断obj中是否包含str成员
# 2. getattr(obj,str) 从obj中获取str成员
# 3. setattr(obj, str, value) 把obj中的str成员设置成value.注意.这⾥的value可以是值,也可以是函数或者⽅法
# 4. delattr(obj, str)把obj中的str成员删除掉
# 注意,反射操作都是在内存中进⾏的.并不会影响你的源代码
 1 ''' 例子:我们看这样⼀个需求,说,有个⼤⽜,写了⼀堆特别⽜B的代码.然后放在了⼀个py⽂件⾥(模块),这时,你想⽤这个⼤⽜写的东⻄.但是.你⾸先得知道⼤⽜写的这些代码都是⼲什么⽤的.那就需要你把⼤⽜写的每⼀个函数跑⼀下.摘⼀摘⾃⼰想⽤的内容.我们来模拟这样的需求.'''
 2 
 3 # 大佬给出的模块
 4 
 5 def chi():
 6     print("胖虎很能吃")
 7 
 8 def he():
 9     print("胖虎很能喝")
10 
11 def la():
12     print("胖虎很能拉")
13 
14 def sa():
15     print("胖虎很能撒")
16 
17 def shui():
18     print("胖虎一睡一年")
19 
20 
21 import master
22 
23 # 注意:以下改动是在内存里改变master内容,而不是改变源文件
24 # hasattr() 查
25 # getattr() 拿
26 # setattr() 改
27 # delattr() 删
28 
29 print('''作为大牛,我帮你写了:
30     chi
31     he
32     la
33     sa
34     shui
35 等功能,你看着用吧''')
36 while 1:
37 
38     s = input("请输入你要测试的功能,q退出\n")
39     if s.strip().upper() == "Q":
40         break
41     if hasattr(master,s): # 获取之前先判断是否存在这个功能,避免报错
42         func = getattr(master,s)  # 获取这个功能 再执行
43         func()
44     else:
45         print("我看你是在为难我胖虎!")
46 
47 
48 #我对大牛的功能不太满意想删改,但又不想改动大牛源文件
49 
50 # 我写的功能
51 def chi():
52     print("胖虎说的不对,胖虎超级能吃")
53 
54 # 改变
55 setattr(master,"chi",chi)  # 此时再运行上面循环就变成我改的代码了
56 
57 #如果不想改动大牛的,又想还有自己的
58 setattr(master,"xinchi",chi)  # 即原master没有这功能,我新增 'xinchi'
59 
60 # 如上可知 setattr与字典类似有就改没有就新增
61 
62 # 再来看看删除 delattr
63 # delattr() 删掉缓存中的chi
64 delattr(master,"chi")  # 第二个参数注意是字符相当于字典的"key"
65 
66 
67 
68 # 以上操作即是反射,反着来. 正常是我们先引入模块, 然后⽤模块去访问模块⾥的内容. 现在反了. 我们⼿动输入要运⾏的功能. 反着去模块⾥找. 这个就叫反射。 同样的也适用与对象和类,可理解成动态的获取修改,程序结束一切又清空,不会对源文件造成改动。
View Code

 

# md5 加密:不可逆的一种加密方式 多用于密码加密,文件验证中
 1 # 创建 加铭文 获取密码都是固定操作
 2 import hashlib
 3 
 4 # 加盐 防止撞库 大幅度提高密码安全等级
 5 SALT = b"fasjfuhfofhfafjafjjjpjhfiahfohioihofsfkhf890%$fl131213.,,["
 6 
 7 # 创建md5的对象
 8 obj = hashlib.md5(SALT)  # 加盐
 9 # 给obj设置铭文
10 obj.update("IG牛逼".encode("utf-8"))
11 # 获取到密文
12 secret = obj.hexdigest()
13 
14 print(secret)  # e31f4e0214b7f355c8b1bb6dff5bf4ae
# 函数MD5加密
 1 # 用函数来执行上面内容
 2 
 3 import hashlib
 4 
 5 def jiami(content):
 6     obj = hashlib.md5(SALT)
 7     obj.update(content.encode("utf-8"))
 8     return obj.hexdigest()
 9 
10 # 注册
11 username = input("请输入你的用户名:\n")
12 password = input("请输入你的密码:\n")
13 password = jiami(password)
14 print(password)   # 78012ff9df2569139c05847e622c4943
15 
16 # 登录
17 username1 = input("请输入你的用户名:\n")
18 password1 = input("请输入你的密码:\n")
19 
20 if username1 == username  and jiami(password1) == password:
21     print("登录成功!")
22 else:
23     print("登录失败!")
View Code

 

 

 





 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

第十八天- 类型判断 函数和方法判断 反

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

第十八天- 类型判断 函数和方法判断 反

# isinstance type issubclass 内置函数:# 1.issubclass() 这个内置函数可判断xxx类是否是yyy类型的子类# issubclass(子类,父类) 1 class Base: 2 pas
2023-01-30

javascript中判断数据类型的方法

这篇文章主要介绍了javascript中判断数据类型的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。js判断数据类型的方法:1、利用typeof操作符,语法“typeof
2023-06-15

javascript判断是否为数字类型的方法

小编给大家分享一下javascript判断是否为数字类型的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!方法:1、利用typeof关键字和isNaN()函数判断;2、利用typeof关键字和isFinite()函数判断
2023-06-14

判断一个变量是数组Array类型的方法

JavaScript中如何判断一个变量是数组Array类型呢?本文向大家提供一个比较不错的方法,可以说是无懈可击了
2022-11-15

python输入数据判断数据类型的方法是什么

在Python中,可以使用`type()`函数来判断数据的类型。例如:```pythondata = input("请输入数据:")data_type = type(data)print("数据类型为:", data_type)```上述代
2023-08-11

Android判断和监听底座状态和类型的方法介绍

底座的状态跟充电状态类似,很多底座提供充电功能(座充). 底座状态同样使用sticky Intent广播。可以查询设备是否插入底座,哪种底座。 判断当前底座状态 广播的Action是ACTION_DOCK_EVENT,sticky Inte
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录