面向对象
类与类之间的关系
组合关系:将一个类的对象封装到另一个类的对象的属性中,就叫组合。
//需求
//设计一个游戏,让游戏里面的任务互殴,加上一个武器类,让人使用武器攻击
//定义角色类,武器类。
class Gamerole:
def __init__(self,name,hp,ad,weapon=None):
self.name = name
self.hp = hp
self.ad = ad
self.weapon = weapon
def attack(self,role2):
print(f"{self.name},开始攻击{role2.name}")
role2.hp -= self.ad
print(f"{self.name}攻击了{role2.name},{role2.name}掉了{self.ad}的血,还剩{role2.hp}")
def equip_weapon(self,weapon,role2):
self.ad+= weapon.ad
self.weapon =weapon.name
role2.hp -= self.ad
print(f"{self.name}利用{self.weapon}攻击了{role2.name}还剩{role2.hp}的血")
class Weapon:
def __init__(self,name,ad,owner=None):
self.name = name
self.ad = ad
self.owner = owner
man = Gamerole('人',100,20)
dog = Gamerole('狗',200,30)
stic = Weapon('棍',20)
#man.attack(dog)
man.equip_weapon(stic,dog)
面向对象的继承
面向对象的三大特性
封装,继承,多态
- 封装是根据职责将属性和方法封装到一个抽象的类中
- 继承实现代码的重用,相同代码不需要重复编写,只需要声明继承关系
- 多态是指不同对象调用相同方法,产生不同的执行结果。
倘若继承时子类与父类有同样的方法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上进行调度。依据是按照时间片轮转,或者是根据优先级来调度
调度算法:
- 先来先服务
- 短进程优先调度
- 时间片轮转法
- 多级反馈调度
进程的并行和并发
并行是两个进程一起在不同的cpu上执行
并发是指两个进程顺序在cpu上执行
同步异步阻塞非阻塞
进程的大概生命周期流程,从创建到就绪队列中排队,等待cpu的调度….
- 同步:两个任务的状态保持一致,要么都成功要么都失败,具体表现在,进程A使用cpu等待另一个事件的发生。
- 异步:两个任务的状态不一定能保持一致,进程A执行时,需要进程B配合,这时候进程A只通知一声,又接着执行自己的任务,它不需要依赖进程B的完成。
阻塞与非阻塞这两个概念与进程等待消息通知时的状态有关。
- 阻塞:等待消息的过程中,什么都不做
- 非阻塞:等待消息的过程中,可以去做其他事情
排列组合有六种情况
同步阻塞,同步非阻塞,异步阻塞,异步非阻塞
进程的创建与结束
进程的创建
- 系统初始化的时候
- 一个进程执行开启了子进程
- 用户的交互请求
无论什么情况,新进程的创建都是由一个已经存在的进程,执行了一个用于创建进程的系统调用而创建的
进程的结束
- 正常退出
- 出错退出
- 严重错误
- 被其他进程杀死