python继承+异常+多态

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()  # 释放运行内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值