将属性和方方法书写到类的里里里面面的操作即为封装 封装可以为属性和方方法添加私有权限
继承子子类默认继承父父类的所有属性和方方法 子子类可以重写父父类属性和方方法
多态传入入不不同的对象,产生生不不同的结果
定义:多态是一一种使用用对象的方方式,子子类重写父父类方方法,调用用不不同子子类对象的相同父父类方方法,可以 产生生不不同的执行行行结果 好处:调用用灵活,有了了多态,更更容易易编写出通用用的代码,做出通用用的编程,以适应需求的不不断变 化! 实现步骤:
定义父父类,并提供公共方方法定义子子类,并重写父父类方方法传递子子类对象给调用用者,可以看到不不同子子类执行行行效果不不同 体验多态 # 1.父类 class Dog(): def eat(self): print('吃骨头') # 2.子类继承父类,并重写父类方法 class Tu_dog(Dog): def eat(self): print('吃肉') class Lang_dog(Dog): def eat(self): print('吃鸡') # 3.定义多态方法 def DogEat(dog): dog.eat() d1 = Lang_dog() DogEat(d1)-修改类属性
类属性只能通过类对象修改,不不能通过实例例对象修改,如果通过实例例对象修改类属性,表示的是创建了了 一一个实例例属性。
class Dog(): name = '狗' def info_print(self): print(name) d1 = Dog() print(d1.name) print(id(d1.name)) print(Dog.name) print(id(Dog.name)) d1.name = '旺财' # Dog.name = '狼狗' print(d1.name) print(id(d1.name)) print(Dog.name) print(id(Dog.name))实例例属性
class Dog(object): def __init__(self): self.age = 5 def info_print(self): print(self.age) wangcai = Dog() print(wangcai.age) # 5 # print(Dog.age) # 报错:实例例属性不不能通过类访问 wangcai.info_print() # 5第一个形参是类对象的方方法 需要用用装饰器器 @classmethod 来标识其为类方方法,对于类方方法,第一个参数必须是类对象,一般以cls 作为第一一个参数。
类方方法使用用场景当方方法中 需要使用用类对象 (如访问私有类属性等)时,定义类方方法 类方方法一一般和类属性配合使用用
class Dog(object): __tooth = 10 @classmethod def get_tooth(cls): return cls.__tooth wangcai = Dog() result = wangcai.get_tooth() print(result) 静态方方法静态方方法特点需要通过装饰器器 @staticmethod 来进行行行修饰,静态方方法既不不需要传递类对象也不不需要传递实例例对象 (形参没有self/cls)。 静态方方法 也能够通过 实例例对象 和 类对象 去访问。
静态方方法使用用场景当方方法中 既不不需要使用用实例例对象(如实例例对象,实例例属性),也不不需要使用用类对象 (如类属性、类方方 法、创建实例例等)时,定义静态方方法 取消不不需要的参数传递,有利利于 减少不不必要的内存占用用和性能消耗
class Dog(): @staticmethod def info_print(): print('test') dog = Dog() Dog.info_print() dog.info_print()封装 继承 多态
类属性 归属于类对象的属性,所有对象共有的属性 实例例属性类方方法 @classmethod def xx(): 代码 静态方方法 @staticmethod def xx(): 代码目标:
了了解异常捕获异常异常的else异常finally异常的传递自自定义异常需求:尝试以 r 模式打开文文件,如果文文件不不存在,则以 w 方方式打开。
try: f = open('test.txt', 'r') except: f = open('test.txt', 'w') 捕获指定异常语法
try: 可能发生生错误的代码 except 异常类型: 如果捕获到该异常类型执行行行的代码 体验 try: print(1/0) except (NameError,ZeroDivisionError) as result: print(result) else: print('没有异常执行的代码') finally: print('无论有没有异常都要执行') 注意: 如果尝试执行行行的代码的异常类型和要捕获的异常类型不不一一致,则无无法捕获异常。一一般try下方方只放一一行行行尝试执行行行的代码。 捕获多个指定异常当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使用用元组的方方式进行行行书写。
try: print(1/0) except (NameError, ZeroDivisionError): print('有错误') 捕获异常描述信息 try: print(num) except (NameError, ZeroDivisionError) as result: print(result) 捕获所有异常Exception是所有程序异常类的父父类。
try: print(num) except Exception as result: print(result) 异常的elseelse表示的是如果没有异常要执行行行的代码。
try: print(1) except Exception as result: print(result) else: print('我是else,是没有异常的时候执行行行的代码') 异常的finallyfinally表示的是无无论是否异常都要执行行行的代码,例例如关闭文文件。
try: f = open('test.txt', 'r') except Exception as result: f = open('test.txt', 'w') else: print('没有异常,真开心心') finally: f.close()体验异常传递
需求: 尝试只读方方式打开test.txt文文件,如果文文件存在则读取文文件内容,文文件不不存在则提示用用户即可。读取内容要求:尝试循环读取内容,读取过程中如果检测到用用户意外终止止程序,则 except 捕获异常 并提示用用户。 """需求: 1. 尝试只读方方式打开test.txt文文件,如果文文件存在则读取文文件内容,文文件不不存在则提示用用户即可。 2. 读取内容要求:尝试循环读取内容,读取过程中如果检测到用用户意外终止止程序,则 except 捕获异常 并提示用用户。""" import time # import os # f1 = open('test.txt','w') # f1.write('aaaaa\nbbbbb\nccccc\nddddd\neeeee') try: f1 = open('test.txt') try: while True: con = f1.readline() if len(con) == 0: break time.sleep(2) print(con) except: print('异常中断了文件读取') finally: f1.close() print('关闭文件') except: print('没有文件')