智能体测开Day24
魔术方法# 魔术方法 魔术方法内建方法内部方法 __init__(): 初始化方法创建对象时自动调用的 __str__()返回一个字符串当打印对象时打印的内容为该函数返回值 __del__()对象销毁时自动执行的 __new__() class Cat: def __init__(self,type,age): self.typetype self.ageage def abc(self): print(ftype{self.type},age{self.age}) def __str__(self): return fCat【type{self.type},age{self.age}】 def __del__(self): print(f{self.type}对象被销毁了) bosi Cat(波斯猫,2) print(bosi) #__main__.Cat object at 0x0000026CBEE6D340 显示内存地址 # 手动销毁 del bosi coffee Cat(加菲猫,2) print(coffee) ju Cat(橘猫,2) # 垃圾回收机制封装# 封装 面向对象有三大特征封装继承多态 封装目的时为了隐藏内部细节只暴露一个接口对外使用这样能减少外部对内部的依赖也可以防止外部直接修改访问内部数据从而保证内部数据的正确性和完整性 封装的步骤 1属性私有化添加__ 外界就不能直接访问该私有属性但是在当前类中可以访问 2对外提供setter和getter方法setter方式用来修该属性getter方法用来获取属性 class People: def __init__(self,name,age,length): self.__name name self.__ageage self.__length length def __str__(self): return ftype { self.__name},age{self.__age},health{self.__length} # 修改类型的 def set_type(self,name): self.__namename def get_type(self): return self.__name def set_age(self,age): if age0: print(年龄不能为负数) self.__age0 elif age100 : print(请再次确认年龄) self.__age 100 else: self.__ageage def get_age(self): return self.__age def set_length(self, length): if length 0 or length 35: self.__length 0 else: self.__length length def get_length(self): return self.__length def eat(self,food_name): print(f{self.__name}吃{food_name}) people1 People(张贼,25,2) print(people1) people1.eat(骨头) # dog.__health100 people1.set_length(-1) print(people1) people1.eat(耗子药) num input(请输入生命体征) # dog.__healthint(num) people1.set_length(int(num)) print(people1) people1.set_age(1000) print(people1)继承# 继承 1一些类有相同的属性和方法将这些相同的属性和方法提前出来放在一个基类基础类让其他类去继承该基类这样其他类也有了基类的所有属性和方法 2基类父类 继承基类的类子类 3继承的作用提高代码的复用率便于代码维护 4继承层级是没有限制的一个子类可以有子类叫间接子类一个父类也可以有父类叫间接父类 5如果一个类没有定义父类默认继承object class Animal(object): def eat(self): print(Animal吃) def run(self): print(Animal跑) class Dog(Animal): def bark(self): print(狗叫) class Cat(Animal): def catch(self): print(猫抓老鼠) class XiaoTian(Dog): def fly(self): print(哮天犬飞) animal Animal() animal.eat() dog Dog() dog.eat() # 父类的方法 dog.bark() # 子类调用自己特有的方法 xiaotian XiaoTian() xiaotian.eat() xiaotian.bark() xiaotian.fly() cat Cat() cat.catch()class Animal(object): def __init__(self,type): self.typetype def eat(self): print(f{self.type}吃) def run(self): print(f{self.type}跑) class Dog(Animal): def bark(self): print(狗叫) class Cat(Animal): def __init__(self,type,age): super().__init__(type) # super代表父类对象 self.ageage def catch(self): print(f{self.type}猫抓老鼠) class PoliceCat(Cat): def __init__(self,type,age,color): super().__init__(type,age) self.colorcolor def abc(self): # super().catch()# 使用super()调用父类的方法 self.catch() print(f{self.type}抓犯人) # 调用父类的属性 dog Dog(狗) cat Cat(猫,2) cat.catch() p_catPoliceCat(黑猫警长,2,黑色) p_cat.abc()方法的重写# 方法的重写 父类中的方法并不适合所有子类不同的子类对于方法的实现不同这事可以在子类中重新定义该方法方法的重写 方法名相同方法的实现不同 class Animal(object): def __init__(self,type): self.typetype def eat(self): print(f{self.type}喜欢吃,end) def run(self): print(f{self.type}跑) class Dog(Animal): def bark(self): print(狗叫) # 方法的重写在子类中定义 def eat(self): super().eat() # 调用父类的方法 print(f骨头) class Cat(Animal): def catch(self): print(f{self.type}猫抓老鼠) def eat(self): super().eat() print(f) dog Dog(狗) dog.bark() dog.eat() # 调用子类重写后的方法 cat Cat(猫) cat.eat()多继承# 多继承 一个父类可以有多个子类一个子类可以有多个父类叫多继承 class A: def demoA(self): print(---A-----demoA---) def testA(self): print(---A-----testA---) class B: def demoB(self): print(---B-----demoB---) def testA(self): print(---B-----testB---) class C(B,A): pass c C() c.testA() c.demoB()多态# 多态 一种事务的多种体现 一个父类对象可以体现为不同的子类形态 多态的前提是继承 形状类 计算面积 圆 r 计算面积 正方形 side 计算面积 工具类 计算各类形状的边长形状 计算各类形状的面积形状 def add(n:int,m:int): return nm class Shape: def area(self): print(形状类计算面积) class Circle(Shape): def __init__(self,r): self.rr def area(self): print(f圆计算面积{3.14*self.r*self.r}) class Square(Shape): def __init__(self,side): self.sideside def area(self): print(f正方形计算面积{self.side**2}) class Tool: # 计算各类形状的面积形状 staticmethod def get_shape_area(m:Shape):# s的类型为Shape m.area() s1 Shape() Tool.get_shape_area(s1) # 传递了一个父类对象 c Circle(3) Tool.get_shape_area(c) s Square(9) Tool.get_shape_area(s)课后作业# 创建一个Animal类实现以下魔术方法 # __init__初始化动物名称和年龄 # __str__返回动物的描述信息 # __del__在对象销毁时打印信息 class Animal(object): def __init__(self, name,age): self.name name self.age age def __str__(self): return f动物名{self.name}年龄{self.age} def __del__(self): print(---------------) print(f{self.name}对象被销毁了) cat Animal(狗,3) print(cat) # 请在此处添加 __str__ 方法 # 此处添加封装属性的方法 # 测试代码 class Book: def __init__(self, title, price): self.__title title self.__price price def __str__(self): return f书名《{self.__title}》, 价格{self.__price}元 def set_title(self,title): self.__titletitle def get_title(self): return self.__title def set_price(self,price): if type(price) int or type(price) float: self.__price price else: print(输入的价格有误) def get_price(self): return self.__price book Book(Python入门, 59.8) print(book) # 期望输出: 书名: 《Python入门》, 价格: 59.8元 # 请设计一个Rectangle(矩形类。 # 属性私有属性__length(长),__width(宽)。 # 方法: # __init__(selflengthwidth)初始化长和宽。 # set_length(self1ength和get_length(se1f)设置和获取长度设置时需检查长度是否大于0。 # set_width(selfwidth和get_width(self)设置和获取宽度设置时需检查宽度是否大于0。 # get_area(se1f)计算并返回矩形的面积。 # get_perimeter(se1f)计算并返回矩形的周长。 # __str__(se1f)返回矩形的描述信息如矩形[长5.0宽3.0]”。 # 编写代码测试这个类创建一个矩形对象计算其面积和周长并尝试设置一个非法的负值宽度。 class Rectangle(): def __init__(self,length,width): self.__length length self.__width width def __str__(self): return f矩形[长{self.__length}宽{self.__width}] def set_length(self,length): if length 0: self.__length length else: print(设置的长度小于0输入有误) def get_length(self): return self.__length def set_width(self,width): if width 0: self.__width width else: print(设置的宽度小于0输入有误) def get_width(self): return self.__width def get_area(self): areas self.__length * self.__width return areas def get_perimeter(se1f): peri (se1f.__length se1f.__width) * 2 return peri juxing Rectangle(5.0,3.0) print(juxing) area1 juxing.get_area() print(area1) peri1 juxing.get_perimeter() print(peri1)# 1 任务1创建Manager类继承Employee # 添加bonus属性 # 重写calculate_pay()方法计算总薪资(salary bonus) # 任务2创建HourlyEmployee类继承Employee # 添加hours_worked属性 # 重写calculate_pay()方法计算时薪(salary * hours_worked) class Employee: def __init__(self, name, salary): self.name name self.salary salary def calculate_pay(self): return self.salary # 创建Manager类继承Employee class Manager(Employee): def __init__(self,name,salary,bonus): super().__init__(name, salary) self.bonus bonus # 重写calculate_pay()方法计算总薪资(salary bonus) def calculate_pay(self): total super().calculate_pay() self.bonus return total # 创建HourlyEmployee类继承Employee class HourlyEmployee(Employee): def __init__(self,name,salary,hours_worked): super().__init__(name, salary) self.hours_worked hours_worked # 重写calculate_pay()方法计算时薪(salary * hours_worked) def calculate_pay(self): Hourly_wage super().calculate_pay() * self.hours_worked return Hourly_wage zz Manager(张泽,8000,1000) print(zz.calculate_pay()) zz1 HourlyEmployee(张泽,8000,120) print(zz1.calculate_pay()) # 2设计一个简单的游戏系统包含不同类型的角色战士、法师、射手每个角色都有attack() # 方法但实现方式不同。请用代码展示如何利用多态来实现这个系统。 # 父类游戏角色 class Character: def __init__(self, name): self.name name # 攻击方法子类重写 def attack(self): print(f{self.name}发起攻击) # 子类1战士 class Warrior(Character): def attack(self): print(f{self.name}挥舞大刀劈砍敌人) # 子类2法师 class Mage(Character): def attack(self): print(f{self.name}释放火球远程轰炸) # 子类3射手 class Archer(Character): def attack(self): print(f{self.name}拉满长弓射出箭矢) # 统一战斗函数接收任意角色自动调用对应attack多态核心 def battle(role): role.attack() # 测试 # 同一个battle函数传入不同角色表现不同攻击效果 c1 Character(花花) battle(c1) w1 Warrior(张泽) battle(w1) m1 Mage(周星) battle(m1) a1 Archer(孙管) battle(a1)