定义类 继承 异常 单例设计模式
发布时间:2026/10/4 14:01:56 作者:尧图编辑部 阅读量:1,286

定义类如果函数在类中那么称之为类方法class Student: def study(self ,course): print(f该学生在学{course}) def play(self): print(该学生在玩) s1Student() s2Student() s1.study(python) s1.play() Student().study(java)#调用当前类中的方法首先需要对当前的类进行实例化类()创建类的属性和方法class Student: def __init__(self,name,age):#创建默认值 self.namename self.ageage def study(self,course): print(f{self.name}正在学习{course}) def play(self): print(f{self.name}正在玩) def __repr__(self):#__创建默认值 return f{self.name}:{self.age} s1Student(周清,21) print(s1)#周清:21 s1.study(python)#周清正在学习python s1.play()#周清正在玩可见性和属性装饰器class Student(): def __init__(self,name,age): self._namename#私有变量 self._ageage#私有变量 def study(self,course_name): print(f{self._name}正在学习{course_name}) s1Student(周清,12) s1.study(python) #print(s1.__name)#没办法访问私有属性property为私有属性提供读取和修改的方法class Student(): def __init__(self,name,age): self._namename#私有变量 self._ageage#私有变量 #获取私有属性 property def name(self): return self._name #修改私有属性 name.setter def name(self,name): self._namename or 无名氏 #获取私有变量 property def age(self): return self._age def study(self,course_name): print(f{self._name}正在学习{course_name}) s1Student(周清,12) print(s1.name,s1.age)#周清 12 s1.study(python)#周清正在学习python s1.name123 print(s1.name) #123静态方法和类方法静态方法传入的参数都是普通的参数不和当前的类进行绑定可以看成一个单独的函数.在调用静态方法时不需要对当前类进行实例化也就是创建对象类方法参数第一位必须是cls代表当前的方法是属于当前的类动态属性class Student(): def __init__(self,name,age): self.namename self.ageage stuStudent(周清,12) #添加一个属性 stu.sex女 print(stu.name,stu.age,stu.sex)#周清 12 女当不想添加属性时写入__slots__(name,age)这样sex就不能添加进去class Student(): __slots__ (name, age) def __init__(self,name,age): self.namename self.ageage stuStudent(周清,12) print(stu.name,stu.age)#周清 12继承单继承多继承class 类名(父亲名)passclass Animal(): def eat(self): print(吃) def sleep(self): print(睡觉) class Dog(Animal): def speak(self): print(汪汪叫) dogDog() dog.eat() dog.speak()子类继承父类可以直接享受父类中已经封装好的方法不需要再次开发子类中应该根据职责封装子类特有的属性和方法继承的传递性方法的重写当父类的方法不能满足子类的要求在进行方行子类中重写的方法class Dog(Animal): def speak(self): print(汪汪叫) #方法的重写 def eat(self): print(吃骨头) dogDog() dog.eat()#吃骨头superdef eat(self): print(吃骨头) super().eat()#吃调用父类的 print(123)另外一种调用的方式通过父类的名字调用Animal.eat(self)父类的私有属性和私有方法子类对象不能在自己的方法内部直接访问父类的私有属性和私有方法子类对象可以通过父类的公有方法间接访问到私有属性和私有方法class Animal(): def __init__(self): self.num1100 #私有的变量 self.__num2200 #私有的方法 def __func(self): print(f{self.num1}{self.__num2}) class Dog(Animal): def func1(self): super().func() pass dogDog() print(dog.num1) #print(dog.__num2)#会报错 dog.func1()#会报错访问父类的私有方法和私有属性class A(): def __init__(self): self.num1100 self.__num2200 def __func(self): print(f{self.num1}{self.__num2}) def func1(self): print(f{self.__num2}) self.__func() class B(A): def func2(self): print(f{self.num1}) self.func1()#子类可以通过父类的公有方法间接访问到父类的私有属性和私有方法 bB() b.func2()#100 #200 #100200多继承class A(): def demo(self): print(demo方法) class B(): def test(self): print(test方法) class C(A,B): pass cC() c.demo() c.test()如果在多继承的情况下发现父类中的方法有重名尽量避免使用多继承多态不同的子类对象调用相同的父类方法产生不同的执行结果多态可以增加代码的灵活度以继承和重写父类方法为前提是调用方法的技巧不会影响到类的内部设计class Dog(): def __init__(self,name): self.name name def play(self): print(f{self.name}在玩耍) class Xiaotiandog(Dog): def play(self): print(f{self.name}在天上飞) class Person(): def __init__(self,name): self.name name def person_with_dog(self,dog): d.play() print(f{self.name}和{dog.name}在一起玩耍) dXiaotiandog(旺财) xiaomingPerson(小明) xiaoming.person_with_dog(d)#旺财在天上飞 #小明和旺财在一起玩耍创建出来的对象叫做类的实例类属性访问类属性有两种方式类名.类属性对象.类属性不推荐class Tool(): count0 def __init__(self,name): self.name name Tool.count1 toolsTool(斧头) print(tools.count)#1 print(Tool.count)#1 tools.count100 print(tools.count)#100 print(Tool.count)#1类方法需要用修饰符classmethod来标识告诉解释器这是一个类方法class Tool(): sum0 def __init__(self,name): self.name name Tool.sum1 classmethod def count(cls): print(f类方式{cls.sum}) def count1(self): print(self.sum) toolsTool(hh) tools1Tool(DGJS) Tool.count() tools.count1()静态方法当前方法不需要访问类属性和调用类方法不需要访问实例属性和调用实例方法的情况下封装成静态方法class A: staticmethod def func():#不需要写self print(小狗在跑) A.func()#直接用类调用单例设计模式目的——让类创建的对象在系统中只有唯一的一个实例每一次执行类名返回的对象内存地址是相同的应用场景音乐播放回收站打印机_new_方法使用类名创建对象时Python的解释器首先会调用_new_方法为对象分配空间重写_new_方法一定要return super()._new_(cls)class Musicplay: def __new__(cls, *args, **kwargs):#父类的new方法已经实现了划分内存地址的代码 print(音乐)new return super().__new__(cls)#为对象分配空间父类中的new方法是一个类方法 def __init__(self): print(音乐器播放音乐) musicplayMusicplay()#音乐 #音乐器播放音乐Python中的单例class Musicplay: instanceNone def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instancesuper().__new__(cls) return cls.instance music1Musicplay() music2Musicplay() print(music1)#__main__.Musicplay object at 0x0000029FB35791C0 print(music2)#__main__.Musicplay object at 0x0000029FB35791C0地址是一样的异常通过异常捕获可以针对突发事件做集中的处理从而保证程序的稳定性和健壮性try: numint(input(请输入数字)) print(num) except: print(请输入一个整数)try: numint(input(请输入数字)) result8/num print(result) except ZeroDivisionError: print(请输入非0的数) except ValueError: print(请输入正确的整数) else: print(输入正确的数字才会执行成功) finally: print(无论是否出现错误都会执行)异常的传递def deno1(): return int(input(请输入一个整数)) def demo2(): return deno1() if __name____main__: try: print(demo2()) except Exception as e: print(f未知错误{e})主动抛出异常def get_password(): passwordinput(请输入密码) if len(password)8: return password #创建异常对象 exException(密码长度不够) # 主动抛出异常 raise ex if __name____main__: try: print(get_password()) except Exception as e: print(f{e})