day11
Python自学,笔记分享
今天多
继承、多态、异常
'''
继承 单继承+多继承
如果两个类是父子类关系,子类则会继承父类的属性和方法
化简代码
'''
# 父类A
class A(object): # 继承object
def __init__(self):
self.num = 1
def info_print(self):
print(self.num)
# 子类B
class B(A): # 继承A
pass
result = B()
result.info_print() # 打印1,确实继承了A
# 单继承和多继承: 2徒弟要继承师傅的技术+徒弟还可以跟学校学
# 当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法
# 师傅类师傅类师傅类师傅类师傅类师傅类师傅类师傅类
class Master(object):
def __init__(self):
self.kongfu = '[你过来啊!]'
def make(self):
print(f'运用{self.kongfu}打架')
# 创建学校类创建学校类创建学校类创建学校类创建学校类
class School(object):
def __init__(self):
self.kongfu = '[学学学]'
def make(self):
print(f'用用{self.kongfu}')
# 徒弟类:继承师傅类和学校类(调用第一个)
class Prentice(Master, School):
# 在子类中添加同名的属性和方法=独创 !!!先调用这个!!!(注意三个优先级)
def __init__(self):
self.kongfu = '[kakakaka]'
self.__money = 2 # 多了两个下划线:定义私有属性
def get_money(self):
return self.__money
def set_money(self):
self.__money = 500
def __info_print(self): # 定义私有方法
print('')
print('')
def make(self):
# 这个括号里不需要写self,因为前面有了,已经能接收到数据了
self.__init__() # 执行一下初始化,若是想也能调用父类的就必须写
print(f'运用{self.kongfu}')
def make_master_cake(self): # 再次封装
# Master.__init__(self) # 调用初始化
# Master.make(self) # 调用父类方法,self一定要写确保接收到数据
super(Prentice, self).__init__()
super(Prentice, self).make()
def make_school_cake(self):
School.__init__(self)
School.make(self) # 这块的self一定要注意
# 无参数super,不写也能查找到父类,只要放置的函数位置正确
super().__init__()
super().make()
# 若子类里有一个与父类同名同姓的就会调用子类的属性,但是若要求调用父类的呢?
# 一个人又会python又会c,这技能都要调用起来(方法写上面了)
daqiu = Prentice() # 先定义才能调用
print(daqiu.kongfu)
daqiu.make() # 打印独创的
daqiu.make_master_cake() # 当三个都打印时,初始化就是必须的:因为如果不加后面的调用会显示上一个
daqiu.make_school_cake()
print(Prentice.__mro__) # 查看类的继承层级
# 多层继承:子类也会老,子类要把技能给孙子,哈哈哈
# 徒孙类徒孙类徒孙类徒孙类徒孙类徒孙类徒孙类徒孙类
class Tusun(Prentice):
pass
xiao = Tusun()
xiao.make() # 能完美调用,啦啦啦
xiao.make_school_cake()
xiao.make_master_cake()
# 调用父类 super() 调用方法二:简单,便捷
# 私有权限:有些方法不想继承给子类
# 但是私有属性能在类里面获取和修改私有属性 get_ set_
# print(xiao.__money) 报错啦
# xiao.__info_print() 报错 啦
# 修改私有属性
xiao.get_money()
xiao.set_money()
print('111111111111111我是分界线11111111111111111111')
'''多态:传入不同产生不同结果
调用不同子类对象的相同父类方法
python的多态不一定非与继承结合
能适应需求的不断变化
'''
# 1、定义父类,并提供公共方法
# 2、定义子类,并重写父亲方法
# 3、传递子类对象给调用者,可以看到不同子类执行结果
class Dog(object):
tooth = 10 # 设置类属性
def work(self): # 父类提供统一的方法,哪怕是空方法
print('指哪打哪。。。')
class ArmyDog(Dog):
def work(self): # 子类重写父类同名方法
print('追击敌人。。')
class DrugDog(Dog):
def work(self):
print('追查毒品。。。')
class Person(object):
def work_with_dog(self, dog): # 传入不同对象,执行不同代码(work函数)
dog.work()
ad = ArmyDog()
dd = DrugDog()
wangcai = Dog()
xiaohei = Dog()
worker = Person()
worker.work_with_dog(ad) # 传入谁就是谁调用对应的work
worker.work_with_dog(dd)
print(Dog.tooth) # 访问类属性
print(wangcai.tooth) # 通过对象访问类
print(xiaohei.tooth)
Dog.tooth = 12 # 修改类属性,全改
wangcai.tooth = 90 # 只有旺财改
print(Dog.tooth)
'''类方法 @classmethod装饰器 第一个参数必须是类对象cls
如果要访问私有类对象时使用类方法
'''
class dog(object):
__tooth = 199 # 私有类属性
@classmethod
def get_tooth(cls):
return cls.__tooth
dahuang = dog()
result = dahuang.get_tooth()
print(result)
'''静态方法 @staticmethod 不需要传递类对象和实力对象
形参没有self\cls
能够取消不必要的参数传递
类和对象都能调用类
'''
class dogg(object):
@staticmethod
def info_print(): # 无参
print('好狗!')
gougou = dogg()
gougou.info_print()
dogg.info_print()
print('111111111111111我是分界线11111111111111111111')
'''异常=报错
如果发生异常,去执行另外一句:确保程序运行
'''
try: # 试运行(只放一行)
f = open('text.txt', 'r')
except: # 上面报错就执行这个只写(w:文件不存在则创建)
f = open('text.txt', 'w')
# 捕获指定异常类型
try:
f = open('text2.txt', 'r')
except SyntaxWarning: # 捕获异常,只有是这个问题时才会执行下面
print('滚出来修bug')
# 捕获多个指定异常:不确定是那个错误的时候+捕获异常描述信息
try:
print(1 / 0)
except(NameError, ZeroDivisionError) as result:
print(result)
# 捕获所有异常 Exception是程序异常类的父类
try:
f = open('text2.txt', 'r')
except Exception as e:
print(e)
else: # 没有异常时执行这个
print('虚惊一场')
finally: # 无论有没有报错都执行,一般是关闭文件
f.close() # 释放运行内存