Python面向对象:重写、单例设计、异常
一、函数重写
1.1 概念和注意事项
重写的概念:override,在继承的前提下,如果在子类中重新实现了父类的函数
重写时的注意事项:
- 什么时候需要重写函数?
- 如果一个类有很多子类,大多数子类可以直接使用父类中实现的功能;
- 但是,如果父类中实现的需求满足不了部分子类的使用,则需要在子类中重写函数
- 重写需要注意的事项
- 保留函数的声明部分:
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 =