isinstance()
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()
isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
用法:
isinstance(a, str) :变量a是否为str类型,是返回true,否返回false
raise
raise 抛出一个指定异常
- raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
- raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
- raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
用法:
常见异常类汇总:https://blog.csdn.net/frank_good/article/details/86299632
预期类型
在定义函数时,参数后面跟 :+ type 构成的语法,例如:
class A:
def demo(self, a: str):
print(cs)
a 的预期类型就是字符型数据,若强行传入其他类型也不会报错,但会有警告!
预期类型也可以有多种,比如 def test(a: (str, list, dict)):
->
-> 符号在底层代码中经常出现,经常出现在python函数定义的函数名后面,其目的是为函数添加元数据
, 描述函数的返回值类型,从而方便开发人员使用,例如:
def demo(self, cs: int)->int:
return cs
Iterable
可迭代类型,通常与isinstance一起来判断一个对象是否可迭代,方法是通过collections.abc
模块的Iterable
类型判断:
>>> from collections.abc import Iterable
>>> isinstance('abc', Iterable) # str 是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list 是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
enumerate()
enumerate
函数可以把一个可迭代对象(如list)变成索引-元素对,这样就可以在for
循环中同时迭代索引和元素本身
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
动态绑定属性和方法
在类外部给类绑定属性
class A:
def demo(self, cs: int)->int:
return cs
a1 = 12
a = A()
a.a1 = a1 # 绑定属性
利用 from types import MethodType 模块 给一个实例绑定方法
from types import MethodType
class A:
def demo(self, cs: int)->int:
return cs
def test(self):
print("test")
a = A()
a.test = MethodType(test, a)
a.test()
但是只给一个实例绑定方法,其他实例无法使用这个方法,其他实例若要使用,则需要给类绑定方法
class A:
def demo(self, cs: int)->int:
return cs
def test(self):
print("test")
A.test = test
a = A()
a.test()
__slots__
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__
变量,来限制该class实例能添加的属性:
class A:
__slots__ = ("name", "age")
def demo(self, cs: int)->int:
return cs
a = A()
a.name = "linyq"
a.age = 19
# a.aaa = 12 # AttributeError报错
需要注意:__slots__
定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
序列化
简单来讲序列化就是将内存中的数据保存到磁盘中,常见库 pickle
pickle.dumps()
import pickle
class A:
__slots__ = ("name", "age")
def demo(self, cs: int)->int:
return cs
if __name__ == '__main__':
a = pickle.dumps(A) # A 可以为list,dict等各种对象
print(a)
>>>b'\x80\x04\x95\x12\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x01A\x94\x93\x94.'
将python对象转换成了bytes,之后可以将这个bytes写入文件或者通过网络进行传输!
pickle.dump() 直接将对象写入一个file object
import pickle
class A:
__slots__ = ("name", "age")
def demo(self, cs: int)->int:
return cs
if __name__ == '__main__':
f = open("class.txt", "wb")
pickle.dump(A, f)
f.close()
反序列化,简而言之就是反向操作,需要用到 pickle.loads()和 pickle.load()
方法
进程和线程
线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。
多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。
理解参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017627212385376