Python面向对象:重写、单例设计、异常

一、函数重写

1.1 概念和注意事项

重写的概念:override,在继承的前提下,如果在子类中重新实现了父类的函数

重写时的注意事项:

  1. 什么时候需要重写函数?
    • 如果一个类有很多子类,大多数子类可以直接使用父类中实现的功能;
    • 但是,如果父类中实现的需求满足不了部分子类的使用,则需要在子类中重写函数
  2. 重写需要注意的事项
    • 保留函数的声明部分:def xxx(self,形参列表)
    • 重新实现函数的实现部分(函数体)

1.2 自定义函数的重写

  • 如果子类未重写父类中的函数,则子类可以继承父类中的函数

  • 如果子类中重写了父类中的函数,子类对象将默认调用子类中重写之后的函数

  • 子类重写函数的时候,如果仍然需要使用父类中函数的功能,则可以在子类函数中调用父类函数

    • 在子类函数中调用父类函数的三种方式

      • 方式一:

        super(当前类,self).__init__(参数列表)
        
      • 方式二:

        super().__init__(参数列表)
        
      • 方式三:

        父类.__init__(self,参数列表)
        
# 父类
class Animal():
    def style(self):
        print("walking")


# 子类1:如果子类未重写父类中的函数,则子类可以继承父类中的函数
class Cat(Animal):
    pass


# 子类2:如果子类中重写了父类中的函数,子类对象将默认调用子类中重写之后的函数
class Fish(Animal):
    def style(self):
        print("swimming")


# 子类3:子类重写函数的时候,如果仍然需要使用父类中函数的功能,则可以在子类函数中调用父类函数
class Bird(Animal):
    def style(self):
        super(Bird, self).style()
        # super().style()
        # Animal.style(self)
        print("flying")


c = Cat()
c.style()

f = Fish()
f.style()

b = Bird()
b.style()

1.3 系统函数的重写

实际应用可能更多

以重写系统的魔术方法__str__为例

魔术方法__str__:当打印一个对象时,默认会调用系统的魔术方法__str__,该函数的返回值默认就是当前对象在内存中的地址

class Person1(object):
 def __init__(self,name,age):
     self.name = name
     self.age = age

p1 = Person1('张三',18)
# 注意2:当打印一个对象时,默认会调用系统的魔术方法__str__,该函数的返回值默认就是当前对象在内存中的地址
print(p1)  # <__main__.Person1 object at 0x0000012CBD588E20>
print(p1.__str__())  # <__main__.Person1 object at 0x0000012CBD588E20>

重写__str__:改为返回当前对象的字符串描述信息

必须返回一个字符串,一般情况下,返回和当前对象相关的属性信息

class Person2(object):
 def __init__(self,name,age):
     self.name = name
     self.age = age
 # 重写__str__
 def __str__(self):
     # 注意:必须返回一个字符串,一般情况下,返回和当前对象相关的属性信息
     return f"姓名:{
     self.name},年龄:{
     self.age}"

p2 =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巧克力配酸奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值