面向对象

类与类之间的关系

组合关系:将一个类的对象封装到另一个类的对象的属性中,就叫组合。

  1. //需求
  2. //设计一个游戏,让游戏里面的任务互殴,加上一个武器类,让人使用武器攻击
  3. //定义角色类,武器类。
  4. class Gamerole:
  5. def __init__(self,name,hp,ad,weapon=None):
  6. self.name = name
  7. self.hp = hp
  8. self.ad = ad
  9. self.weapon = weapon
  10. def attack(self,role2):
  11. print(f"{self.name},开始攻击{role2.name}")
  12. role2.hp -= self.ad
  13. print(f"{self.name}攻击了{role2.name},{role2.name}掉了{self.ad}的血,还剩{role2.hp}")
  14. def equip_weapon(self,weapon,role2):
  15. self.ad+= weapon.ad
  16. self.weapon =weapon.name
  17. role2.hp -= self.ad
  18. print(f"{self.name}利用{self.weapon}攻击了{role2.name}还剩{role2.hp}的血")
  19. class Weapon:
  20. def __init__(self,name,ad,owner=None):
  21. self.name = name
  22. self.ad = ad
  23. self.owner = owner
  24. man = Gamerole('人',100,20)
  25. dog = Gamerole('狗',200,30)
  26. stic = Weapon('棍',20)
  27. #man.attack(dog)
  28. man.equip_weapon(stic,dog)

面向对象的继承

面向对象的三大特性

封装,继承,多态

  1. 封装是根据职责将属性和方法封装到一个抽象的类中
  2. 继承实现代码的重用,相同代码不需要重复编写,只需要声明继承关系
  3. 多态是指不同对象调用相同方法,产生不同的执行结果。
    class person:
    def __init__(self,name,age)
    class man(person):
    def __inti__(self,sex)
       super().__init__(name,age)
    
    倘若继承时子类与父类有同样的方法
    则会优先执行子类的方法,如果想一起执行的话,可以通过添加关键字super()来指定相同的方法。就可以父类子类的都执行
    对于父类的私有方法或属性不能直接调用,对于保护方法或属性可以直接调用。
    多继承就是指:在继承时,指定多个父类,父类与父类之间通过逗号隔开。 ```python class Dog(object): def init(self, name): self.name = name def game(self):
     print("%s 蹦蹦跳跳的玩耍..." % self.name)
    

class XiaoTianDog(Dog): def game(self): print(“%s 飞到天上去玩耍…” % self.name) class Person(object): def init(self, name): self.name = name def game_with_dog(self, dog): print(“%s 和 %s 快乐的玩耍…” % (self.name, dog.name)) dog.game() wangcai = Dog(“旺财”) xiaotianquan = XiaoTianDog(“飞天旺财”)
xiaoming = Person(“小明”) xiaoming.game_with_dog(wangcai) xiaoming.game_with_dog(xiaotianquan)

小明调用相同方法,得到了不同结果,原因是小明调用的方法指向了不同的对象,不同的对象有着相同的函数但是实现却不一样。

<a name="Q9UXJ"></a>
### 类的成员
总体分为属性和方法,又有私有和正常之分。有一些特殊的存在:类方法,静态方法,属性,双下方法。isinstance和issubclass。
<a name="V5pbd"></a>
#### 类方法:
在方法的参数中加一个cls关键字并添加一个@classmethod装饰器,就声明这个方法是类方法,它的特点是能在类的内部通过类名调用的方法。作用是通过它来传递类的属性和方法。(不能传实例的属性和方法)
<a name="Ew5BW"></a>
#### 静态方法:
是指添加了@staticmethod装饰器的一种方法,它的特点是不调用类的属性和方法。把它放到类中只是为了方便管理。
<a name="HNb02"></a>
#### 属性:
是指在一个方法前添加了property装饰器,访问它时会执行一段函数然后返回值。可以将一个方法当成是属性来看待。<br />isinstance方法可以判断一个对象是否属于某个类。<br />issubclass方法可以判断两个类是否是派生关系。
<a name="QJSwM"></a>
#### 双下方法:
```python
__len__ //len一个对象就会触发len方法
__hash__ //查看对象的hash值
__str__ //定义了str方法后,在print对象时,默认输出该方法的返回值
__repr__//repr一个对象时,默认输出该方法的返回值
__call__ //
__eq__ //在判断print相等时会输出里面的内容
__del__ //
__new__ //
__item__ //
__enter__ //在with的语句执行前调用
__exit__ //在with的语句结束后会调用

反射

python面向对象的反射,通过特殊方法的形式操作对象的相关属性,
对对象的反射:
hasattr():判断某个对象是否有某个属性
getattr():获取某个对象的属性
setattr():设置属性
delattr():删除属性
对类的反射:
使用反射可以提高健壮性,通过事先判断有没有这个方法再决定是否调用

总结:
这两节课讲了类的成员,和反射。
类的成员就是属性方法,私有公有,类方法,静态方法,属性,双下方法,isinstance,issubclass等方法
反射就是通过函数来操作对象的属性,例如getattr,setattr,delattr,hasattr。

套接字编程

因为pycharm的模块或者是解释器的问题,导致模块不能正确导入,先暂停看后面的章节。

并发编程

进程

进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础,狭义的定义进程是正在运行的程序的实例。
进程的特性:

  • 动态性:进程的实质是程序的一次动态执行过程,进程是动态产生,动态消亡的
  • 并发性:任何进程都可以和其他进程并发执行
  • 独立性:进程是一个独立运行的基本单位,同时也是分配资源和调度的基本单位
  • 异步性:进程的执行过程具有间断性

进程的调度
因为cpu资源有限,不可能每个进程都独占一个cpu,所以进程会在cpu上进行调度。依据是按照时间片轮转,或者是根据优先级来调度
调度算法:

  1. 先来先服务
  2. 短进程优先调度
  3. 时间片轮转法
  4. 多级反馈调度

进程的并行和并发
并行是两个进程一起在不同的cpu上执行
并发是指两个进程顺序在cpu上执行

同步异步阻塞非阻塞
image.png
进程的大概生命周期流程,从创建到就绪队列中排队,等待cpu的调度….

  • 同步:两个任务的状态保持一致,要么都成功要么都失败,具体表现在,进程A使用cpu等待另一个事件的发生。
  • 异步:两个任务的状态不一定能保持一致,进程A执行时,需要进程B配合,这时候进程A只通知一声,又接着执行自己的任务,它不需要依赖进程B的完成。

阻塞与非阻塞这两个概念与进程等待消息通知时的状态有关。

  • 阻塞:等待消息的过程中,什么都不做
  • 非阻塞:等待消息的过程中,可以去做其他事情

排列组合有六种情况
同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

进程的创建与结束

进程的创建

  1. 系统初始化的时候
  2. 一个进程执行开启了子进程
  3. 用户的交互请求

无论什么情况,新进程的创建都是由一个已经存在的进程,执行了一个用于创建进程的系统调用而创建的
进程的结束

  1. 正常退出
  2. 出错退出
  3. 严重错误
  4. 被其他进程杀死