python面向对象

    技术2022-07-11  117

    课程视频链接

    Python面向对象:https://b23.tv/jg6FZv

    1. 基础篇教程代码

    # 类是一个模板 #类属性: # 1、整个类只有一份,所有的实例都共享这一份 # 2、可以通过类名或实例名访问类属性,访问的都是同一个 # 3、修改类属性需要通过类名,因为通过实例名会创建一个同名的实例变量 # 4、当实例属性和类属性相同时,通过实例访问,优先访问的是实例属性 # 类方法: # 1、可以通过类名调用,也可以通过实例名调用 # 2、类方法不能访问实例变量,可以访问类变量 # 3、类方法需要加上@classmethod, 第一参数必须是class(cls) # 静态方法: # 1、需要加上@staticmethod # 2、不需要传入实例或者类作为第一个参数 class Dog: # num_of_dogs = 0 #类属性,区分类属性和实例属性 dogs = [] #用来保存所有狗的列表 @classmethod #类方法 def num_of_dogs(cls): #添加类方法,@classmethod, 传参cls return len(cls.dogs) @classmethod def biggest(cls): max_height = -0.1 for d in cls.dogs: if(d.height > max_height): max_height = d.height return max_height @staticmethod #静态方法 def intro(): print("Dog is human's best friend") #构造方法, 添加实例属性,做其他的初始化工作 def __init__(self, name, height, power):#self指代一般实例,特殊 self.name = name #属性可以由外部传入 self.height = height self.blood = 10 #属性可以定成死的 self.power = power # Dog.num_of_dogs += 1 #初始化个数 Dog.dogs.append(self) print(f"{self.name}出生了,汪汪!") #创建实例方法、行为 def bark(self):#只有一个参数,调用的时候不用传 #前面加f,后面可以加变量 print(f'我是{self.name},身高{self.height},血量{self.blood},攻击力{self.power}') def attack(self, dog2):#有2个参数,调用的时候传1个 dog2.reduce_blood(self.power) def reduce_blood(self, reduce_value): if(reduce_value > self.blood): self.blood = 0 print(f'{self.name}受到攻击,死亡') else: self.blood = self.blood - reduce_value print(f'{self.name}受到攻击,减少{reduce_value}点血量') #创建2个实例 d1 = Dog('大黄', 0.7, 3) #self不用传入 d2 = Dog('二黑', 0.5, 4) print(d1.blood) d1.blood = 9 #修改属性 print(d1.blood)#属性不加括号 print(id(d1)) #取实例内存地址 print(id(d2)) d1.bark()#方法要加括号,属性不加括号 d2.bark() d1.attack(d2) d2.bark() # Dog.num_of_dogs = 8 #修改类属性 # d1.num_of_dogs = 7 #给d1创建新的实例属性,当实例属性和类属性相同时,通过实例访问,优先访问的是实例属性 # print(Dog.num_of_dogs)#通过类名访问 # print(d1.num_of_dogs)#通过实例访问 # print(d2.num_of_dogs)#通过实例访问 print(Dog.num_of_dogs())#通过类名访问 print(d1.num_of_dogs())#通过实例访问 print(d2.biggest())#通过实例访问 Dog.intro()#通过类名访问 d1.intro()#通过实例访问

    2. 类的继承

    # 类的继承 # 模块类的引入 # import dog继承 as dog # pd = dog.PetDog('小可爱',0.2,1,988) class Dog: def __init__(self, name, height, power):#self指代一般实例,特殊 self.name = name #属性可以由外部传入 self.height = height self.blood = 10 #属性可以定成死的 self.power = power def bark(self):#只有一个参数,调用的时候不用传 #前面加f,后面可以加变量 print(f'我是{self.name},身高{self.height}') # 牧羊犬 #类的继承,继承Dog类的一些属性 class SheepDog(Dog): #对类的命名:驼峰命名法,各单词首字母大写 def __init__(self, name, height, power, num_of_sheeps): super().__init__(name, height, power) #继承父类Dog self.num_of_sheeps = num_of_sheeps # 给子类添加方法 def protect(self): print('我开始保护小羊了!') # 重写父类方法 def bark(self): print("我是牧羊犬,我骄傲!") super().bark() #继承父类Dog # 警犬 class PoliceDog(Dog): def __init__(self, name, height, power, ability): super().__init__(name, height, power) self.ability = ability # 宠物犬 class PetDog(Dog): def __init__(self, name, height, power, price, house): super().__init__(name, height, power) self.price = price self.house = house class DogHouse(): def __init__(self, no): self.no = no print(f'已创建狗窝{self.no}') sd = SheepDog('牧羊犬1', 0.6, 4, 5) #self不用传入 print(sd.name) print(sd.blood) sd.bark() house = DogHouse('9527') #其他实例作为属性 pd = PetDog('小可爱',0.2,1,988, house)

    3. Dog版本的吃鸡游戏

    片码段 dog.py

    #2种狗具有不同的攻击力和防御能力。攻击强的防御弱;反之亦然; import random class Dog: dogs = [] #保存所有活着的Dog def __init__(self, name): self.name = name self.blood = 100 self.attack_power = 5 self.defense_power = 3 #攻击! def attack(self, dog2): print(f'{self.name}攻击{dog2.name},攻击力:{self.attack_power},防御力:{dog2.defense_power}') point = self.attack_power - dog2.defense_power if(dog2.blood > point): dog2.blood -= point print(f'{dog2.name}受到攻击,奋力自救,血量减少为{dog2.blood}') else: dog2.blood = 0 print(f'{dog2.name}受到攻击,失血过多,死亡!😭😭😭😭😭😭😭😭') Dog.dogs.remove(dog2) #判定狗的类型 def dog_type(self): if(isinstance(self, SheepDog)): return '牧羊犬🐑' elif(isinstance(self, PoliceDog)): return '警犬👮' else: return '普通犬' #牧羊犬 class SheepDog(Dog): def __init__(self, name): super().__init__(name) self.attack_power = random.randint(5, 10) self.defense_power = random.randint(3,5) print('🐑牧羊犬{self.name}问世!') self.dogs.append(self) #警犬 class PoliceDog(Dog): def __init__(self, name): super().__init__(name) self.attack_power = random.randint(8, 13) self.defense_power = random.randint(1,3) print('👮‍♀️警犬{self.name}问世!') self.dogs.append(self)

    主程序 game.py

    #1. 首先创建100个Dog, 50个SheepDog, 50个PoliceDog #2. 每一轮游戏,随机选出2个Dog #3. dog1先攻击dog2,然后dog2攻击dog1 #3. 任何一方血量变为0就表明死亡!死亡的Dog退出游戏。 #4. 最后只有一个Dog了,游戏结束,胜利者可以吃鸡。 from dog import * import random #产生随机数字 import time #时间模块 #1.创建100条狗 for i in range(100): if(i%2==0): SheepDog(i+1) #创建1个牧羊犬 else: PoliceDog(i+1) #创建1个警犬 #2. 开始游戏循环 while(True): #判断是否只有1个Dog if(len(Dog.dogs) == 1): winner = Dog.dogs[0] print('🐔🐔🐔🐔🐔🐔🐔🐔') print('大吉大利,今晚吃鸡!') print(f'赢家是:{winner.dog_type()} {winner.name}') print('🐔🐔🐔🐔🐔🐔🐔🐔') break dog1, dog2 = random.sample(Dog.dogs, 2) # 随机选取两个 dog1.attack(dog2) dog2.attack(dog1) time.sleep(0.02) # 休眠,产生视觉效果
    Processed: 0.012, SQL: 9