Python继承、方法重写

继承

在编写类时,并不是每次都要从空白开始。当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率。

class one():
	"""类的帮助信息"""		# 类的说明
	Code					# 类体
class two(one):
	"""类的帮助信息"""		# 类的说明
	Code					# 类体

示例代码1:

class Demo:
    @property
    def print_value(self):
        return 1


class Demo2(Demo):  # 将Demo传入Demo2,让Demo2继承Demo的功能(可以使用Demo的功能)
    @property
    def print_value2(self):
        return 2


value = Demo2()
print(value.print_value)  # 可以看到继承了Demo后我们就可以直接访问到Demo中的属性了

执行结果:
	1

示例代码2:

class Fruit:
    color = '绿色'

    def harvest(self, color):
        print(f"水果是:{color}的!")
        print("水果已经收获...")
        print(f"水果原来是{Fruit.color}的!")


class Apple(Fruit):
    color = "红色"

    def __init__(self):
        print("我是苹果")


class Orange(Fruit):
    color = "橙色"

    def __init__(self):
        print("\n我是橘子")


apple = Apple()  # 实例化Apple()类
apple.harvest(apple.color)  # 在Apple()中调用harvest方法,并将Apple()的color变量传入
orange = Orange()
orange.harvest(orange.color)  # 在Orange()中调用harvest方法,并将Orange()的color变量传入

执行结果:
	我是苹果
	水果是:红色的!
	水果已经收获...
	水果原来是绿色的!
	
	我是橘子
	水果是:橙色的!
	水果已经收获...
	水果原来是绿色的!

方法重写

基类(被继承的类)的成员都会被派生类(继承的新类)继承,当基类中的某个方法不完全适用于派生类时,就需要在派生类中重写父类的这个方法。

如上面的示例代码2,基类中定义的harvest()方法,无论派生类是什么水果都显示"水果…",如果想要针对不同水果给出不同的提示,可以在派生类中重写harvest()方法。例如,在创建派生类Orange()时,重写harvest()方法如下:

class Fruit:
    color = '绿色'

    def harvest(self, color):
        print(f"水果是:{color}的!")
        print("水果已经收获...")
        print(f"水果原来是{Fruit.color}的!")


class Apple(Fruit):
    color = "红色"

    def __init__(self):
        print("我是苹果")


class Orange(Fruit):
    color = "橙色"

    def __init__(self):
        print("\n我是橘子")

    def harvest(self, color):  # 重写harvest 
        print(f"橘子是:{color}的!")
        print("橘子已经收获...")
        print(f"橘子原来是{Fruit.color}的!")


apple = Apple()  # 实例化Apple()类
apple.harvest(apple.color)  # 在Apple()中调用harvest方法,并将Apple()的color变量传入
orange = Orange()
orange.harvest(orange.color)  # 在Orange()中调用harvest方法,并将Orange()的color变量传入

执行结果:
	我是苹果
	水果是:红色的!
	水果已经收获...
	水果原来是绿色的!
	
	我是橘子
	橘子是:橙色的!
	橘子已经收获...
	橘子原来是绿色的!

注意:如本类中和父类同时存在这个方法名称,将只会执行本类中的这个方法,不会调用父类的同名方法(包括__init__())

派生类中调用基类__init__()方法

在派生类中定义__init__()方法时,不会自动调用基类的__init__()方法,如下示例代码:

class Fruit:

    def __init__(self, color="绿色"):
        Fruit.color = color

    def harvest(self):
        print(f"水果原来是{Fruit.color}的!")


class Apple(Fruit):

    def __init__(self):
        print("我是苹果")


apple = Apple()
apple.harvest()

执行结果:
	我是苹果
	Traceback (most recent call last):
	  File "D:/xuexi/python/Demo.py", line 51, in <module>
	    apple.harvest()
	  File "D:/xuexi/python/Demo.py", line 41, in harvest
	    print(f"水果原来是{Fruit.color}的!")
	AttributeError: type object 'Fruit' has no attribute 'color'

可以看到如上调用出现报错了,要让派生类调用基类的__init__()方法进行必要的初始化,需要在派生类使用super函数调用基类的__init__()方法

super().__init__()  #调用积累的__init__()方法(注意缩进)

示例代码:

class Fruit:  # 定义水果类(基类)
    def __init__(self, color="绿色"):
        Fruit.color = color      # 定义类属性

    def harvest(self, color):
        print("水果是:" + color + "的!")  # 输出的是形式参数color
        print("水果已经收获……")
        print("水果原来是:" + Fruit.color + "的!")  # 输出的是类属性color


class Apple(Fruit):  # 定义苹果类(派生类)
    color = "红色"

    def __init__(self):
        print("我是苹果")
        super().__init__()


class Aapodilla(Fruit):  # 定义人参果类(派生类)

    def __init__(self, color):
        print("\n我是人参果")
        super().__init__(color)

    def harvest(self, color):  # 重写harvest()方法的代码
        print("人参果是:"+ color +"的!")           # 输出的是形式参数color
        print("人参果已经收获……")
        print("人参果原来是:"+Fruit.color+"的!")   # 输出的是类属性color


apple = Apple()  # 创建类的实例(苹果)
apple.harvest(apple.color)  # 调用基类的harvest()方法

sapodilla = Aapodilla("白色")  # 创建类的实例(人参果)
sapodilla.harvest("金黄色带紫色条纹")  # 调用基类的harvest()方法

执行结果:
	我是苹果
	水果是:红色的!
	水果已经收获……
	水果原来是:绿色的!
	
	我是人参果
	人参果是:金黄色带紫色条纹的!
	人参果已经收获……
	人参果原来是:白色的!

实践

示例代码1:

class Demo:
    """更换手机默认语言"""
    def __init__(self, language='英语'):
        Demo.language = language
        print(f"智能手机默认的语言为{Demo.language}")


class Demo2(Demo):

    def __init__(self, language='中文'):
        super().__init__(language)
        print("开始变更语言...")

    def default(self, language):
        print(f"已将智能手机默认的语言设置为{language}")


languages = Demo2()
languages.default("中文")

执行结果:
	智能手机默认的语言为中文
	开始变更语言...
	已将智能手机默认的语言设置为中文

示例代码2:

class Demo3:
    """输出每月销售额"""
    def __init__(self):
        self.January = ("商品编号:T0001 商品名称:笔记本电脑",)  # 使用元组是如果只有一个参数要加一个逗号,不然系统默认你括号中是一个普通字符串
        self.February = ("商品编号:T0002 商品名称:华为荣耀", "商品编号:T0003 商品名称:iPad")
        self.March = ()
        self.April = ()
        self.May = ()
        self.June = ()
        self.July = ()
        self.August = ()
        self.September = ()
        self.October = ()

    def get(self, month=1):
        print(f"【{month}】月出售的商品有:")

        if month == 1:
            for i in self.January:
                print(i)

        elif month == 2:
            for i in self.February:
                print(i)

        """..."""


num = int(input("请输要查询的月份:"))
value = Demo3()
value.get(num)

执行结果:
	请输要查询的月份:2
	【2】月出售的商品有:
	商品编号:T0002 商品名称:华为荣耀
	商品编号:T0003 商品名称:iPad
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页