Python小白入门的学习记录 4

107 阅读4分钟

类的定义

#面向对象

class Player():#定义一个类 类名最好大写 相同的内容归纳总结
    def __init__(self,name,hp,**occu**):#所有类和方法中第一个参数一定要带self
        self.name=name #self表示Player进行实例化后的实例化本身user
        self.hp=hp #变量(name)被称作为属性,函数(print_role)称作为方法
        **self.occu=occu**
    def print_role(self):#定义一个方法  类有什么功能
        print('%s:%s ***%s***'%(self.name,self.hp,**self.occu**))
    def updatername(self,newname):#重命名
        self.name=newname
class Monster():
    '定义怪物类'
    pass
#先定义但不编写时
user1=Player('tom',100,'war')      #类的实例化  把用户与类关联起来 用户拥有类的特征  类到具体用户的过程叫类的实例化
user2=Player('jerry',100,'master')
user1.print_role()#调用这个方法
user2.print_role()
**user1.updatername('marry')
user1.print_role()**

加粗体为如何增加属性和方法

当类的属性不想被访问时在属性前加__ 例self.__name,变量将不会被实例访问:类的封装

类的继承

猫科动物(父类)-->猫(子类) 猫继承猫科动物的方法

继承:class 子类名称(父类名称):

class Monster():     #父类
    '定义怪物类'
    def __init__(self,hp=100):#hp 初始值100
        self.hp=hp

    def run(self):       #定义怪物的方法 就是能干啥
        print('移动到某个位置')


class Animals(Monster):      #子类继承父类 子类(父类名称)
  #  '普通怪物'
   def __init__(self,hp=10):
      # self.hp=hp
       super().__init__(hp)  # super在父类中初始化了某些属性在子类中便不需要再次初始化

#怪物
a1=Monster(100)
print(a1.hp)
print(a1.run())

a2=Animals(1)
print(a1.hp)
print(a2.run())

多态

当父类和子类都定义同一个同名的方法时 子类的调用会覆盖父类

class Monster():#父类
    '定义怪物类'
    def __init__(self,hp=100):#hp 初始值100
        self.hp=hp

    def run(self):#定义怪物的方法 就是能干啥
        print('移动到某个位置')
    def whoami(self):
        print('我是父类')
class Boss(Monster):#子类
    def __init__(self, hp=10):
        super().__init__(hp)  # super在父类中初始化了某些属性在子类中便不需要再次初始化
  #  '大怪物'
    def whoami(self):
        print('我是子类')
 a3=Boss(10)
 a3.whoami()

所示结果:我是子类

tisp:

①利用type区分类

print('a1的类型是%s'%type(a1))
print('a2的类型是%s'%type(a2))
print('a3的类型是%s'%type(a3))

所示结果:

a1的类型是<class 'main.Monster'>

a2的类型是<class 'main.Animals'>

a3的类型是<class 'main.Boss'>

②利用isinstance区分父类子类

print(isinstance(a2,Monster))

所示结果:True (不是则显示False)

③当在父类初始化后的属性不需要在子类再次定义可以用 super

super().init(属性名)

④Python中所有的列表,元组,字符串...都归于类,其父类为object

⑤类无法直接引用需要进行实例化

自定义with语句的使用

with 语句

with open() as f:

自定义with语句

class Testwith():
    def __enter__(self):
        print('run')
    def __exit__(self, exc_type, exc_val, exc_tb):
        # enter&exit 指在对类进行初始化和类结束时被调用
        print('exit')
        if exc_tb is None: #利用exc_tb判断是否有异常
            print('正常结束')
        else:
            print("有异常 %s" %exc_tb)
with Testwith():  #Testwith在enter时输出 run 在exit时输出exit
    print('Test is running')

    raise  NameError('testNameError') #手动抛出异常

多线程

定义

我的理解 多个并发的渠道解决问题 比如多个打饭窗口

循环
def myThread(arg1, arg2):
    print('%s %s' % (arg1, arg2))

for i in range(1, 6, 1):  # 循环五次 递增1
    t1 = myThread(i, i + 1)
    
    
线程

import threading #导入函数库
import time
from threading import current_thread #显示当前线程运行状态
def myThread(arg1, arg2):
    print(current_thread().getName(),'start') #getName 获取线程名称
    print('%s %s' % (arg1, arg2))
    time.sleep(2)
    print(current_thread().getName(),'stop')

for i in range(1, 6, 1):  # 循环五次 递增1
    t1= threading.Thread(target=myThread,args=(i,i+1))#Thread 方法 target参数:用来传递函数名 args:对函数进行传递参数
    t1.start() #start方法使多线程运行
print(current_thread().getName(),'end')

多线程之间的同步

面向对象

import threading
from threading import current_thread

class Mythread(threading.Thread):#利用类继承 threading.Thread() 利用多态形式将run方法重写
    def run(self):
        print(current_thread().getName(),'start')
        print('run')
        print(current_thread().getName(),'stop')

a1=Mythread()#实例化
a1.start()#线程启动
a1.join()

print(current_thread().getName(),'end')

所示结果:

Thread-1 start

run

Thread-1 stop

MainThread end

生产者和消费者问题

队列

import queue
q=queue.Queue() #产生队列
q.put(1) #在队列中增加数
q.put(2)
q.get() #从属队列中取得数  按顺序读取
#生产者和消费者问题
from threading import Thread,current_thread  #实现多个生产者和多个消费者并行生产和消费
import time
import random  #生产随机数据
from queue import Queue #队列

queue=Queue(5) #定义队列长度  队列长度决定数据多少

class ProducerThread(Thread):
    def run(self):
        name=current_thread().getName() #获取线程名字
        nums=range(100)
        global queue
        while True:
            num=random.choice(nums) #随机选择数字
            queue.put(num)#随机数字放入队列中 生产者可通过随机的休眠时间往队列中添加数字
            print('生产者%s生成了数据%s'%(name,num))
            t=random.randint(1,3)
            time.sleep(t)
            print('生产者%s休眠了%s秒'%(name,t))

class ConsumerThread(Thread):
    def run(self):
        name=current_thread().getName()
        global queue
        while True:
            num=queue.get() #消费者可通过随机的休眠时间往队列中提取数字
            queue.task_done() #task_done() 线程等待的方法
            print('消费者%s 消耗了数据%s'%(name,num))
            t=random.randint(1,5)
            time.sleep(t)
            print('消费者%s休眠了%s秒'%(name,t))

p1=ProducerThread(name='p1')
p1.start()
c1=ConsumerThread(name='c1')
c1.start()
c2=ConsumerThread(name='c2')
c2.start()