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

# 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  可以隔代判断

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,"哈哈哈"))

# 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‘>>

# 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

‘‘‘总结---类方法:任何情况都是方法静态方法:任何情况都是函数实例方法:对象使用是方法,类使用是函数‘‘‘
# 反射:
# 关于反射, ?共有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 # 以上操作即是反射,反着来. 正常是我们先引入模块, 然后?模块去访问模块?的内容. 现在反了. 我们?动输入要运?的功能. 反着去模块?找. 这个就叫反射。 同样的也适用与对象和类,可理解成动态的获取修改,程序结束一切又清空,不会对源文件造成改动。

# 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("登录失败!")




原文地址:https://www.cnblogs.com/xi1419/p/9937360.html

时间: 2024-10-08 01:04:29

第十八天- 类型判断 函数和方法判断 反射的相关文章

PHP判断{函数/类/方法/属性}是否存在

1.php判断系统函数或自己写的函数是否存在 bool function_exists ( string $function_name ) 判断函数是否已经定义,例如: if(function_exists('curl_init')){ curl_init(); }else{ echo 'not function curl_init'; } 2.php判断类是否存在 bool class_exists ( string $class_name [, bool $autoload = true ]

函数和方法的区别

函数和方法的区别 一.函数和方法的区别 1.函数要手动传self,方法不用传 2.如果是一个函数,用类名去调用,如果是一个额方法,用对象去调用 举例说明: class Foo(object): def __init__(self): self.name="haiyan" def func(self): print(self.name) obj = Foo() obj.func() Foo.func(obj) 判断函数和方法的方式 from types import FunctionTy

Python中函数和方法的区别

1.函数要手动传self,方法不用传self 2.如果是一个函数,用类名去调用,如果是一个方法,用对象去调用 举例说明: class Foo(object): def __init__(self): self.name="haiyan" def func(self): print(self.name) obj = Foo() obj.func() Foo.func(obj) 判断函数和方法的方式 from types import FunctionType,MethodType obj

JS的数据类型判断函数、数组对象结构处理、日期转换函数,浏览器类型判断函数合集

工具地址:https://github.com/BothEyes1993/bes-jstools bes-jstools 100多个基础常用JS函数和各种数据转换处理集合大全,此工具包是在 outils 的基础上,加上个人平时收集的代码片段进行的二次整合 Browser Support 7+ ? Latest ? Latest ? Latest ? Latest ? 6.1+ ? Installing npm install bes-jstools --save Using nodejs con

PHP常用类型判断函数

1.gettype():获取变量类型 2.is_array():判断变量类型是否为数组类型 3.is_double():判断变量类型是否为倍浮点类型 4.is_float():判断变量类型是否为浮点类型 5.is_int():判断变量类型是否为整数类型 6.is_integer():判断变量类型是否为长整数类型 7.is_long():判断变量类型是否为长整数类型 8.is_object():判断变量类型是否为对象类型 9.is_real(): 判断变量类型是否为实数类型 10.is_strin

jstypeof方法判断undefined类型

有关js判断undefined类型,使用typeof方法,typeof 返回的是字符串,其中就有一个是undefined. js判断undefined类型if (reValue== undefined){alert("undefined");}发现判断不出来,最后查了下资料要用typeof方法:if (typeof(reValue) == "undefined") {  www.jbxue.comalert("undefined"); } typ

js/jquery判断浏览器的方法小结

在网站前端开发中,浏览器兼容性是前端开发框架要解决的第一个问题,要解决兼容性问题就得首先准确判断出浏览器的类型及其版本,而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道.今天我们把各种判断方法都总结一下,希望对大家有所帮助 JS获取浏览器信息 浏览器代码名称:navigator.appCodeName 浏览器名称:navigator.appName 浏览器版本号:navigator.appVersion 对Java的支持:navigator.javaEnabled() MIM

判断函数是否存在

当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在.同样的method_exists可以用来检测类的方法是否存在. 判断函数是否存在 function_exists()function func() { } if(function_exists('func')){ echo"存在"; } 判断类是否存在 class_exists()class func { } // 使用前检查类是否存在 if

SQL Server、Oracle和MySQL判断NULL的方法

SQL Server.Oracle和MySQL判断NULL的方法 本文讲述SQL Server.Oracle.MySQL查出值为NULL的替换. 在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 Java代码 复制代码代码如下: ISNULL ( check_expression , replacement_value ) ISNULL ( check_expression , replacement_value )