Python中类型判断
type
from types import MethodType, FunctionType
types
python内置模块
Python3 中类型判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| types.BuiltinFunctionType types.BuiltinMethodType types.CodeType types.DynamicClassAttribute types.FrameType types.FunctionType types.GeneratorType types.GetSetDescriptorType types.LambdaType types.MappingProxyType types.MemberDescriptorType types.MethodType types.ModuleType types.SimpleNamespace types.TracebackType types.new_class types.prepare_class
|
Dynamic type creation and names for built-in types
Typical use of these names is for isinstance()
or issubclass()
checks.
isinstance
这个真的鲜为人知, 我们可以用 isinstance(x, (float, int))
来判断 x
是不是数:
1 2 3 4 5 6
| >>> isinstance(1, (float, int)) True >>> isinstance(1.3, (float, int)) True >>> isinstance("1.3", (float, int)) False
|
那么对于第三个测试,你把 str
加入元组就可以看到这是怎么回事了:
1 2
| >>> isinstance("1.3", (float, int, str)) True
|
也就是那个元组里面是 或 的关系,只要是其中一个的实例就返回 True
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class A: def __init__(self, name): self.name = name
class B(A): def __init__(self): print("class B")
instance_A = A('baozi') instance_B = B()
print(isinstance(instance_B, A)) print(instance_A.name) print(type(instance_A) is A) print(type(instance_B) is A)
class B True baozi True False
|
isinstance(b, A)
# 检测的是对象是不是某一个类 及父类的 对象
(type(b) is B)
# 检测的是对象是不是某一个类的实例
反射
使用字符串的方式,操作对象的属性(对象属性,类的动态属性(方法))
某个命名空间中的某个 ‘变量名’ , 获取这个变量名对应的值
getattr(命名空间,’key’) == 命名空间.key
所有的a.b 都可以被反射成 getattr(a,’b’)
hasattr(obj, str)
判断对象中是否包含xxxx(str)
. **
getattr(obj, str)
从对象中获取xxx(str)
**
get
表⽰示找, attr
表⽰示属性(功能).
setattr(obj, str, value)
把对象中的str
设置成value
o. # obj.str = value
delattr(obj, str)
从对象中删除xxxx(str)
# del obj.str
类\对象\模块 实际上都是有自己的命名空间 ,从这个命名空间中获取某个值或者函数…名字
如果这个名字字符串数据类型
值 = getatt
r(命名空间,’字符串类型名字’)
如果getattr
的值是一个属性或者普通变量,那么直接得到结果
如果getattr
的值是函数或者方法 获取的是内存地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from types import MethodType, FunctionType import os, sys
def iscall(file_di): attr = input('arg>>') if hasattr(file_di, attr): type_valeus = getattr(file_di, attr) if isinstance(type_valeus, (FunctionType)): return type_valeus()
elif isinstance(type_valeus, (str, int, list, dict)): return type_valeus
|
sys
modules
反射本文件中的名字 反射全局变量的值(
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| from sys import modules
a = 1 b = 2 lst = [1, 2, 3] class Manager: pass class Student: pass class Teacher: pass
getattr(modules[__name__], 'Student') identify = input('>>>').strip() 类 = getattr(modules[__name__], identify) print(类) 对象 = 类() print(对象)
print(modules[__name__])
<module '__main__' from '/Users/toorl/PycharmProjects/A17task/day026/05反射.py'>
|