当前位置:   article > 正文

Python-VBA函数之旅-type函数

Python-VBA函数之旅-type函数

目录

一、type函数的常见应用场景

二、type函数使用注意事项

三、如何用好type函数?

1、type函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页: https://myelsa1024.blog.csdn.net/

一、type函数的常见应用场景

        type函数在Python中有多个实际应用场景,尽管它主要用于获取对象的类型,但在某些特定情况下,它也能提供重要的信息或用于编程的某些方面,其常见的应用场景有:

1、类型检查: 当你需要确保某个变量或对象具有特定的类型时,可以使用type()函数进行检查,这在编写函数或方法时特别有用,尤其是当函数需要特定类型的参数时。

2、动态类型判断:在某些情况下,你可能需要根据对象的类型来执行不同的操作,使用type()函数可以帮助你实现这种动态类型判断。

3、反射和元编程:在需要编写能够处理不同类型对象的通用代码时,可以使用type()函数和相关的元编程技术。例如,你可以检查一个对象的类型,并基于该类型调用不同的方法或执行不同的操作。

4、注册和类型映射:在构建大型系统时,可能需要将对象类型映射到特定的处理函数或类,type()函数可以用于实现这样的类型到行为的映射。

5、工厂函数和类工厂:在需要基于输入参数动态创建不同类型对象的情况下,可以使用type()函数作为类工厂,这在实现复杂的工厂模式或元编程时可能很有用。

6、调试和日志记录:在开发过程中,type()函数可以帮助你确定变量的实际类型,这在调试或记录对象状态时可能很有用。

7、与其他类型系统交互:当与需要明确类型信息的外部系统或库交互时,type()函数可以帮助你提供正确的类型信息。

8、与内建类型进行比较:有时你可能想要检查一个对象是否是某个特定的内建类型(如int, str, list等),虽然isinstance()函数是更推荐的做法,但type()函数也可以用于此目的。

二、type函数使用注意事项

        在Python中使用type()函数时,请注意以下几点:

1、避免直接使用type()函数进行类型检查:虽然type()函数可以用来检查对象的类型,但在实践中,更推荐使用isinstance()函数来进行类型检查,这是因为isinstance()会考虑子类关系,而type()则不会,如果你的代码期望接受某个类或其子类的实例,使用isinstance()会更加灵活和健壮。

2、动态类型与静态类型:Python是一种动态类型语言,这意味着变量的类型可以在运行时改变,因此,过度依赖type()函数进行类型检查可能并不符合Python的哲学,在编写Python代码时,应该尽量利用动态类型的优势,而不是试图强制所有变量都保持固定的类型。

3、使用type()创建新类型:虽然type()函数可以用于在运行时动态地创建新的类型,但这种用法在Python中并不常见,Python提供了更直观和易于理解的class语法来定义新的类型,这在大多数情况下都是首选的方法。

4、不要修改内建类型的 `__name__` 或 `__class__` 属性:尽管Python允许你修改对象的属性,但你应该避免修改内建类型或对象的 `__name__` 或 `__class__` 属性,这些属性在Python的内部机制中扮演着重要的角色,修改它们可能会导致不可预测的行为或错误。

5、理解type()函数和class的关系:在Python中,type()函数实际上是一个内建的元类,它负责创建和管理类,当你使用class关键字定义一个类时,Python会自动使用type()作为元类来创建这个类,理解这个关系有助于你更深入地理解Python的类系统。

6、处理NoneType:当你使用type()函数检查一个值为None的变量时,它将返回<class 'NoneType'>,确保在代码中正确处理这种情况,特别是当你期望某个变量可能是None时。

7、注意类型注解(从Python 3.5开始):虽然类型注解(如 `def foo(x: int) -> str:`)并不会改变Python 的动态类型特性,但它们为代码提供了额外的类型信息;类型注解主要用于文档、类型检查和可能的静态类型分析,type()函数与类型注解没有直接关系,但在编写和阅读带有类型注解的代码时,你应该意识到这些注解的存在和用途。

三、如何用好type函数?

        type()函数在Python中用于获取对象的类型,这个函数非常有用,尤其是在你想了解某个对象的类型,或者你想根据对象的类型来执行不同的操作时。为了用好type()函数,请遵循以下建议和方法:

1、获取对象的类型:使用type()函数可以轻松地获取任何对象的类型。

2、判断对象的类型:你可以使用type()函数来判断一个对象是否属于特定的类型,但是,通常建议使用内置的isinstance()函数来进行类型检查,因为它支持子类检查(即如果对象是某个类的子类的实例,isinstance()也会返回True)。

3、在动态类型系统中使用:Python是一种动态类型语言,但type()函数仍然在某些情况下很有用。例如,你可能有一个函数,它接受一个对象并根据该对象的类型执行不同的操作。

4、与isinstance()函数结合使用:虽然type()函数可以用于类型检查,但isinstance()函数通常是更好的选择,但是,你可以结合使用type()和isinstance()两个函数来检查对象是否属于特定的元组或集合中的类型。

​​​​​​​

1、type函数:
1-1、Python:
  1. # 1.函数:type
  2. # 2.功能:
  3. # 2-1、一个参数:用于获取对象的类型
  4. # 2-2、多个参数:用于获取新的类型对象
  5. # 3.语法:
  6. # 3-1、type(object)
  7. # 3-2、type(name, bases, dict, **kwds)
  8. # 4.参数:
  9. # 4-1、object:想要检查其类型的对象或变量
  10. # 4-2、相关参数说明如下:
  11. # 4-2-1、name:一个字符串,表示新类型的名称
  12. # 4-2-2、bases:一个元组,表示新类型所继承的父类元组的集合(一个或多个)
  13. # 4-2-3、dict:一个字典,其中包含定义新类型的属性的键值对
  14. # 4-2-4、**kwds:一个额外的关键字参数,但在创建类时通常不使用
  15. # 5.返回值:
  16. # 5-1、一个参数:返回对象的类型
  17. # 5-2、多个参数:返回新的类型对象
  18. # 6.说明:
  19. # 7.示例:
  20. # 用dir()函数获取该函数内置的属性和方法
  21. print(dir(type))
  22. # ['__abstractmethods__', '__annotations__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__',
  23. # '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__',
  24. # '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__instancecheck__', '__itemsize__',
  25. # '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__or__', '__prepare__', '__qualname__', '__reduce__',
  26. # '__reduce_ex__', '__repr__', '__ror__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__',
  27. # '__text_signature__', '__weakrefoffset__', 'mro']
  28. # 用help()函数获取该函数的文档信息
  29. help(type)
  30. # 应用一:类型检查
  31. # 示例1:使用type()进行类型检查
  32. def check_type_with_type(obj, target_type):
  33. return type(obj) is target_type
  34. # 示例
  35. num = 123
  36. print(check_type_with_type(num, int)) # 输出: True
  37. string = "hello"
  38. print(check_type_with_type(string, str)) # 输出: True
  39. # 错误的类型检查(不建议)
  40. print(check_type_with_type(string, list)) # 输出: False
  41. # True
  42. # True
  43. # False
  44. # 示例2:使用isinstance()进行类型检查(推荐)
  45. def check_type_with_isinstance(obj, target_type):
  46. return isinstance(obj, target_type)
  47. # 示例
  48. num = 123
  49. print(check_type_with_isinstance(num, int)) # 输出: True
  50. string = "hello"
  51. print(check_type_with_isinstance(string, str)) # 输出: True
  52. # 检查子类
  53. class MyList(list):
  54. pass
  55. my_list = MyList([1, 2, 3])
  56. print(check_type_with_isinstance(my_list, list)) # 输出: True
  57. # True
  58. # True
  59. # True
  60. # 应用二:动态类型判断
  61. # 示例1:使用type()进行动态类型判断
  62. def dynamic_type_check(obj):
  63. if type(obj) is int:
  64. print(f"The object is an integer with value: {obj}")
  65. elif type(obj) is str:
  66. print(f"The object is a string with value: '{obj}'")
  67. elif type(obj) is list:
  68. print(f"The object is a list with elements: {obj}")
  69. else:
  70. print(f"The object is of type: {type(obj)}")
  71. # 示例
  72. dynamic_type_check(123) # 输出: The object is an integer with value: 123
  73. dynamic_type_check("hello") # 输出: The object is a string with value: 'hello'
  74. dynamic_type_check([1, 2, 3]) # 输出: The object is a list with elements: [1, 2, 3]
  75. dynamic_type_check(3.14) # 输出: The object is of type: <class 'float'>
  76. # The object is an integer with value: 123
  77. # The object is a string with value: 'hello'
  78. # The object is a list with elements: [1, 2, 3]
  79. # The object is of type: <class 'float'>
  80. # 示例2:使用isinstance()进行动态类型判断(推荐)
  81. def dynamic_type_check_with_isinstance(obj):
  82. if isinstance(obj, int):
  83. print(f"The object is an integer or a subtype of integer with value: {obj}")
  84. elif isinstance(obj, str):
  85. print(f"The object is a string or a subtype of string with value: '{obj}'")
  86. elif isinstance(obj, list):
  87. print(f"The object is a list or a subtype of list with elements: {obj}")
  88. else:
  89. print(f"The object is of type: {type(obj)}")
  90. # 示例,包括自定义类(子类)
  91. class MyString(str):
  92. pass
  93. my_string = MyString("custom string")
  94. dynamic_type_check_with_isinstance(123) # 输出: The object is an integer or a subtype of integer with value: 123
  95. dynamic_type_check_with_isinstance("hello") # 输出: The object is a string or a subtype of string with value: 'hello'
  96. dynamic_type_check_with_isinstance(
  97. my_string) # 输出: The object is a string or a subtype of string with value: 'custom string'
  98. dynamic_type_check_with_isinstance(
  99. [1, 2, 3]) # 输出: The object is a list or a subtype of list with elements: [1, 2, 3]
  100. dynamic_type_check_with_isinstance(3.14) # 输出: The object is of type: <class 'float'>
  101. # The object is an integer or a subtype of integer with value: 123
  102. # The object is a string or a subtype of string with value: 'hello'
  103. # The object is a string or a subtype of string with value: 'custom string'
  104. # The object is a list or a subtype of list with elements: [1, 2, 3]
  105. # The object is of type: <class 'float'>
  106. # 应用三:反射和元编程
  107. # 示例1:使用type()进行反射
  108. class MyClass:
  109. def __init__(self, value):
  110. self.value = value
  111. def reflect_on_object(obj):
  112. print(f"Object type: {type(obj)}")
  113. print(f"Object attributes: {dir(obj)}")
  114. # 示例
  115. obj = MyClass(42)
  116. reflect_on_object(obj)
  117. # Object type: <class '__main__.MyClass'>
  118. # Object attributes: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
  119. # '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__',
  120. # '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'value']
  121. # 示例2:使用type()进行元编程
  122. def create_class_dynamically(class_name, base_classes=(), attrs={}):
  123. return type(class_name, base_classes, attrs)
  124. # 示例:动态创建一个类
  125. DynamicClass = create_class_dynamically('DynamicClass', (),
  126. {'x': 10, 'y': 20, 'display': lambda self: print(self.x, self.y)})
  127. # 实例化并调用方法
  128. instance = DynamicClass()
  129. instance.display() # 输出: 10 20
  130. # 验证类的属性
  131. print(type(DynamicClass)) # 输出: <class 'type'>
  132. print(DynamicClass.x) # 输出: 10
  133. # 10 20
  134. # <class 'type'>
  135. # 10
  136. # 示例3:复杂的元编程示例--工厂函数创建类
  137. def class_factory(class_name, class_attributes):
  138. methods = {k: v for k, v in class_attributes.items() if callable(v)}
  139. other_attrs = {k: v for k, v in class_attributes.items() if not callable(v)}
  140. def init_method(self, **kwargs):
  141. for key, value in other_attrs.items():
  142. setattr(self, key, value)
  143. for key, value in kwargs.items():
  144. setattr(self, key, value)
  145. class_dict = {'__init__': init_method}
  146. class_dict.update(methods) # 将方法添加到类字典中
  147. return type(class_name, (object,), class_dict)
  148. # 示例:使用工厂函数创建类
  149. Person = class_factory('Person', {'name': 'placeholder', # 这里使用一个占位符,将在初始化时设置
  150. 'greet': lambda self: print(f"Hello, I'm {self.name}")})
  151. # 实例化并调用方法
  152. person = Person(name='John Doe', age=30) # 在这里设置 name 属性
  153. person.greet() # 输出: Hello, I'm John Doe
  154. print(person.name) # 输出: John Doe
  155. print(person.age) # 输出: 30
  156. # Hello, I'm John Doe
  157. # John Doe
  158. # 30
  159. # 应用四:注册和类型映射
  160. # 定义一个类型到处理函数的映射字典
  161. type_registry = {}
  162. # 注册类型的装饰器
  163. def register_type(type_class):
  164. def decorator(func):
  165. type_registry[type_class] = func
  166. return func
  167. return decorator
  168. # 一个处理int类型的函数
  169. @register_type(int)
  170. def handle_int(value):
  171. print(f"Handling integer: {value}")
  172. # 一个处理str类型的函数
  173. @register_type(str)
  174. def handle_str(value):
  175. print(f"Handling string: {value}")
  176. # 一个处理类型并调用相应处理函数的函数
  177. def handle_value(value):
  178. value_type = type(value)
  179. if value_type in type_registry:
  180. type_registry[value_type](value)
  181. else:
  182. print(f"No handler for type {value_type}")
  183. # 使用示例
  184. handle_value(123) # 输出: Handling integer: 123
  185. handle_value("hello") # 输出: Handling string: hello
  186. handle_value(3.14) # 输出: No handler for type <class 'float'>
  187. # 如果需要,可以添加更多的类型处理函数
  188. @register_type(float)
  189. def handle_float(value):
  190. print(f"Handling float: {value}")
  191. # 现在float类型也被处理了
  192. handle_value(3.14) # 输出: Handling float: 3.14
  193. # Handling integer: 123
  194. # Handling string: hello
  195. # No handler for type <class 'float'>
  196. # Handling float: 3.14
  197. # 应用五:工厂函数和类工厂
  198. # 示例1:工厂函数示例
  199. class Animal:
  200. def __init__(self, name):
  201. self.name = name
  202. def speak(self):
  203. pass
  204. class Dog(Animal):
  205. def speak(self):
  206. return "Woof!"
  207. class Cat(Animal):
  208. def speak(self):
  209. return "Meow!"
  210. def animal_factory(animal_type, name):
  211. if animal_type == 'dog':
  212. return Dog(name)
  213. elif animal_type == 'cat':
  214. return Cat(name)
  215. else:
  216. raise ValueError(f"Unsupported animal type: {animal_type}")
  217. # 使用工厂函数
  218. dog = animal_factory('dog', 'Buddy')
  219. print(dog.speak()) # 输出: Woof!
  220. cat = animal_factory('cat', 'Whiskers')
  221. print(cat.speak()) # 输出: Meow!
  222. # Woof!
  223. # Meow!
  224. # 示例2:类工厂示例
  225. def class_factory(class_name, base_classes=(), class_attributes={}):
  226. return type(class_name, base_classes, class_attributes)
  227. # 定义Animal类的通用属性和方法
  228. def animal_init(self, name):
  229. self.name = name
  230. def animal_speak(self):
  231. pass
  232. AnimalAttributes = {
  233. 'species': '',
  234. 'num_legs': 0,
  235. '__init__': animal_init,
  236. 'speak': animal_speak
  237. }
  238. # 使用类工厂创建一个新的类
  239. DogClass = class_factory('Dog', (object,), {
  240. **AnimalAttributes,
  241. 'species': 'dog',
  242. 'num_legs': 4,
  243. 'speak': lambda self: "Woof!" # 或者定义一个名为dog_speak的函数,然后引用它
  244. })
  245. # 实例化新创建的类
  246. dog = DogClass('Buddy')
  247. print(dog.speak()) # 输出: Woof!
  248. print(dog.species) # 输出: dog
  249. print(dog.num_legs) # 输出: 4
  250. # Woof!
  251. # dog
  252. # 4
  253. # 应用六:调试和日志记录
  254. # 示例1:基本的调试输出
  255. def check_type(obj):
  256. print(f"The type of {obj} is: {type(obj)}")
  257. # 使用示例
  258. number = 123
  259. string_value = "Hello, World!"
  260. list_example = [1, 2, 3]
  261. check_type(number) # 输出: The type of 123 is: <class 'int'>
  262. check_type(string_value) # 输出: The type of Hello, World! is: <class 'str'>
  263. check_type(list_example) # 输出: The type of [1, 2, 3] is: <class 'list'>
  264. # The type of 123 is: <class 'int'>
  265. # The type of Hello, World! is: <class 'str'>
  266. # The type of [1, 2, 3] is: <class 'list'>
  267. # 示例2:使用logging模块记录类型信息
  268. import logging
  269. # 配置logging
  270. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
  271. def log_type(obj):
  272. logging.info(f"The type of {obj} is: {type(obj)}")
  273. # 使用示例
  274. number = 123
  275. string_value = "Hello, World!"
  276. log_type(number) # 输出: 时间戳 - INFO - The type of 123 is: <class 'int'>
  277. log_type(string_value) # 输出: 时间戳 - INFO - The type of Hello, World! is: <class 'str'>
  278. # 2024-05-13 22:47:10,127 - INFO - The type of 123 is: <class 'int'>
  279. # 2024-05-13 22:47:10,127 - INFO - The type of Hello, World! is: <class 'str'>
  280. # 示例3:在复杂函数中使用type()进行错误检查
  281. import logging
  282. def divide(a, b):
  283. if type(a) not in [int, float] or type(b) not in [int, float]:
  284. raise ValueError("Both a and b must be numbers.")
  285. if type(b) is int and b == 0:
  286. raise ValueError("Cannot divide by zero.")
  287. return a / b
  288. try:
  289. result = divide(10, 2)
  290. print(result) # 输出: 5.0
  291. except ValueError as e:
  292. logging.error(e)
  293. try:
  294. result = divide(10, "two")
  295. except ValueError as e:
  296. logging.error(e) # 输出: 时间戳 - ERROR - Both a and b must be numbers.
  297. try:
  298. result = divide(10, 0)
  299. except ValueError as e:
  300. logging.error(e) # 输出: 时间戳 - ERROR - Cannot divide by zero.
  301. # ERROR:root:Both a and b must be numbers.
  302. # ERROR:root:Cannot divide by zero.
  303. # 5.0
  304. # 示例4:在面向对象编程中使用type()进行类型检查
  305. import logging
  306. class Animal:
  307. pass
  308. class Dog(Animal):
  309. pass
  310. def feed(animal):
  311. if not isinstance(animal, Animal):
  312. raise TypeError("animal must be an instance of Animal or its subclasses.")
  313. print(f"Feeding {type(animal).__name__}...")
  314. dog = Dog()
  315. feed(dog) # 输出: Feeding Dog...
  316. not_an_animal = "Not an animal"
  317. try:
  318. feed(not_an_animal)
  319. except TypeError as e:
  320. logging.error(e) # 输出: 时间戳 - ERROR - animal must be an instance of Animal or its subclasses.
  321. # ERROR:root:animal must be an instance of Animal or its subclasses.
  322. # Feeding Dog...
  323. # 应用七:与其他类型系统交互
  324. # 示例1:使用type()进行条件导入
  325. def load_module_based_on_type(obj):
  326. if type(obj) is int:
  327. import math # 假设你需要math模块来处理整数
  328. print(math.sqrt(obj))
  329. elif type(obj) is str:
  330. import re # 假设你需要re模块来处理字符串
  331. print(re.search(r'\d+', obj)) # 示例:查找字符串中的数字
  332. else:
  333. print("Unsupported type for module loading.")
  334. load_module_based_on_type(9) # 输出: 3.0(平方根)
  335. load_module_based_on_type("abc123") # 输出: <re.Match object; span=(3, 6), match='123'>
  336. # 3.0
  337. # <re.Match object; span=(3, 6), match='123'>
  338. # 示例2:使用type()和自定义类型
  339. class Person:
  340. def __init__(self, name, age):
  341. self.name = name
  342. self.age = age
  343. def greet(entity):
  344. if type(entity) is Person:
  345. print(f"Hello, {entity.name}. You are {entity.age} years old.")
  346. else:
  347. print(f"Hello, but I don't know how to greet a {type(entity)}.")
  348. p = Person("Myelsa", 18)
  349. greet(p)
  350. greet("Not a person")
  351. # Hello, Myelsa. You are 18 years old.
  352. # Hello, but I don't know how to greet a <class 'str'>.
1-2、VBA
略,待后补。
2、推荐阅读:

2-1、Python-VBA函数之旅-isinstance()函数

Python算法之旅:Algorithms

Python函数之旅:Functions

个人主页: https://myelsa1024.blog.csdn.net/
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/585214
推荐阅读
相关标签
  

闽ICP备14008679号