Python接口和抽象类(python 类 接口)
python下的抽象类的用途和意义?
抽象方法是基类中定义的方法,但却没有任何实现。在java中,可以把方法申明成一个接口。而在python中实现一个抽象方法的简单的方法是:\x0d\x0aclass Sheep(object):\x0d\x0adef get_size(self):\x0d\x0araise NotImplementedError\x0d\x0a任何从Sheep继承下来的子类必须实现get_size方法。否则就会产生一个错误。但这种实现方法有个缺点。定义的子类只有调用那个方法时才会抛错。这里有个简单方法可以在类被实例化后触发它。使用python提供的abc模块。\x0d\x0aimport abc\x0d\x0aclass Sheep(object):\x0d\x0a__metaclass__ = abc.ABCMeta\x0d\x0a@abc.absractmethod\x0d\x0adef get_size(self):\x0d\x0areturn\x0d\x0a这里实例化Sheep类或任意从其继承的子类(未实现get_size)时候都会抛出异常。\x0d\x0a因此,通过定义抽象类,可以定义子类的共同method(强制其实现)。
python中,面向对象有哪些机制有利于代码复用?
Python中面向对象编程有以下机制有利于代码复用:
1.继承(Inheritance):子类可以继承父类的属性和方法,并且可以在不改变父类的情况下对其进行扩展或修改,从而减少代码的重复编写。例如,一个父类定义了通用的方法,子类可以继承这些方法并添加特定的实现。
在这个例子中,我们定义了一个父类 Animal,它有两个属性 name 和 species,还有一个抽象方法 make_sound。然后我们定义了一个子类 Dog,它从父类 Animal 中继承了 name 和 species 属性,并重写了 make_sound 方法,以实现狗的叫声。由于我们使用继承,所以 Dog 类可以重用 Animal 类的代码,而不必重新编写。
2.多态(Polymorphism):多态允许不同的对象以不同的方式对同一个消息作出响应。例如,一个类的不同实例可以实现相同的方法,但表现出不同的行为。这使得代码更加灵活和可扩展。
在这个例子中,我们定义了一个抽象基类 Shape,它有一个抽象方法 area。然后我们定义了两个子类 Rectangle 和 Circle,它们分别实现了 area 方法,以计算矩形和圆形的面积。由于它们都继承了 Shape 类,并实现了相同的方法名 area,所以我们可以通过相同的方式对它们进行操作,以实现多态。例如:
在这个例子中,我们创建了一个包含两个不同类型的对象的列表,并使用循环对它们进行操作。由于它们都实现了 area 方法,所以我们可以使用相同的方式调用它们的方法,以计算它们的面积。
3.组合(Composition):组合是将一个类作为另一个类的属性,从而实现代码复用的一种方法。例如,一个汽车类可以包含多个引擎类的实例,从而可以在不同的汽车中重复使用相同的引擎代码。
在这个例子中,我们定义了一个 Engine 类,它有两个方法 start 和 stop,用于启动和停止引擎。然后我们定义了一个 Car 类,它有三个属性 make、model 和 engine,其中 engine 是一个 Engine 类的实例。我们还定义了两个方法 start 和 stop,用于启动和停止汽车,其中 start 方法会调用 engine 实例的 start 方法,从而启动引擎。由于我们使用组合,所以我们可以在不同的汽车中重复使用相同的引擎代码,从而减少了代码的重复编写。
4.接口(Interface):接口是定义了一组方法签名的抽象类,可以用来描述类的行为,而不需要实现这些方法的具体细节。其他类可以实现这个接口,并且必须实现接口中定义的所有方法。这使得代码更加可读和易于维护,因为接口提供了一种统一的方式来定义类的行为。
在这个例子中,我们定义了一个抽象基类 Animal,它有一个抽象方法 make_sound,用于定义动物的叫声。然后我们定义了两个子类 Dog 和 Cat,它们分别实现了 make_sound 方法,以定义狗和猫的叫声。由于它们都实现了 Animal 类的接口,所以它们有相同的行为,我们可以使用相同的方式对它们进行操作。
python基础(abc类)
ABC是Abstract Base Class的缩写。
Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助abc模块。
abc类中常见的方法有:ABCMeta,abstractmethod,classmethod
这是用来生成抽象基础类的元类。由它生成的类可以被直接继承。
通过注册进行具体化抽象类
通过继承具体化抽象类
python中的concurrent.futures模块
concurrent.futures 模块提供了并发执行调用的高级接口
并发可以使用 threads 执行,使用 ThreadPoolExecutor 或 分离的 processes ,使用 ProcessPoolExecutor 。都实现了同一个接口,这个接口在抽象类 Executor 定义
wait 等待 fs 里面所有的 Future 实例(由不同的 Executors 实例创建的)完成。返回两个命名元祖,第一个元祖名为 done ,存放完成的 futures 对象,第二个元祖名为 not_done ,存放未完成的 futures 。
return_when 参数必须是 concurrent.futures 里面定义的常量: FIRST_COMPLETED , FIRST_EXCEPTION , ALL_COMPLETED
返回一个迭代器, yield 那些完成的 futures 对象。 fs 里面有重复的也只可能返回一次。任何 futures 在调用 as_completed() 调用之前完成首先被 yield 。
Future() 封装了可调用对象的异步执行。 Future 实例可以被 Executor.submit() 方法创建。除了测试之外不应该直接创建。 Future 对象可以和异步执行的任务进行交互
1、抽象类,提供异步调用的方法。不能被直接使用,而是通过构建子类。
2、方法
shutdown(wait=True)
给 executor 发信号,使其释放资源,当 futures 完成执行时。已经 shutdown 再调用 submit() 或 map() 会抛出 RuntimeError 。使用 with 语句,就可以避免必须调用本函数
ThreadPoolExecutor 是 Executor 的子类使用线程池来异步执行调用
如果使用不正确可能会造成死锁,所以 submit 的 task 尽量不要调用 executor 和 futures ,否则很容易出现死锁
默认的max_workers是设备的处理器数目*5
ProcessPoolExecutor 使用 multiprocessing 模块,不受 GIL 锁的约束,意味着只有可以 pickle 的对象才可以执行和返回
__main__ 必须能够被工作子进程导入。所以意味着 ProcessPoolExecutor 在交互式解释器下不能工作。
提交给 ProcessPoolExecutor 的可调用方法里面调用 Executor 或 Future 将会形成死锁。
class concurrent.futures.ProcessPoolExecutor(max_workers=None)
max_workers 默认是处理器的个数
exception concurrent.futures.CancelledError
exception concurrent.futures.TimeoutError
exception concurrent.futures.process.BrokenProcessPool
Python有什么优势?
Python的优势有:
1. 易于学习:Python的语法简单,易于理解,容易上手,对新手友好;
2. 功能强大:Python拥有丰富的标准库,可以实现各种复杂的任务;
3. 高效:Python可以实现高效的程序,可以节省开发时间;
4. 可移植性:Python代码可以在多个平台上运行,可以轻松移植到其他系统;
5. 开源免费:Python是开源免费的,可以免费使用;
6. 可扩展性:Python可以使用C/C++语言扩展,可以提高程序的运行效率。
python里面也有java中的抽象类和接口吗
接口是抽象类的一种特殊形式。先看一下定义,类中有抽象方法的类是抽象类,接口定义的是类中的方法全部都是抽象方法。也就是说抽象类中抽象方法可以是一个或者全部,但是接口中方法只能全部都是抽象方法。还有在实现的时候,接口是通过实现的形式,抽象类是通过继承的方式。