返回顶部
首页 > 资讯 > 后端开发 > Python >python重写方法和重写特殊构造方法
  • 372
分享到

python重写方法和重写特殊构造方法

2024-04-02 19:04:59 372人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录继承多继承的优缺点子类的方法__init__()重写父类的方法将实例用作属性继承 编写类时,并非总是要从空白开始,如果编写的类是另一个现成类的特殊版本,可使用继承,继承分为单继承

继承

编写类时,并非总是要从空白开始,如果编写的类是另一个现成类的特殊版本,可使用继承,继承分为单继承和多继承。

一个类继承另一个类时,将自动获得另一个类的所有属性和方法,原有的类称为父类,而新类称为子类。子类继承了父类所有的属性和方法,同时还可以定义自己的属性和方法,这样一来就解决了类类与类之间代码冗余的问题

那么儿子怎么查看自己的父亲是谁呢?

如下所示:

class Parent_1:
    pass
class Parent_2:
    pass
class sub1(Parent_1):#单继承
    pass
#查看自己的父类
print(sub1.__bases__)
class sub2(Parent_1,Parent_2):#多继承
    pass
#查看自己的父类
print(sub2.__bases__)
(<class '__main__.Parent1'>,)
(<class '__main__.Parent1'>, <class '__main__.Parent2'>)

多继承的优缺点

优点:子类可以同时遗传多个父类的属性,最大限度地重用代码 缺点:违背伦理道德,一个儿子可以有多个爹,体现在程序中则为代码地可读性变差。

继承查找的顺序:

对象>子类>父类>父父类

举例:

class Fu():
    def f1(self):
        print('Fu.f1')
    def f2(self):
        print('Fu.f2')
        self.f1()#对象名.方法(),此时的self==objects
class son(Fu):
    def f1(self):
        print('son.f1')
objects=son()
objects.f2()

根据继承查找的顺序,对象>子类>父类>父父类,先在objects空间范围内查找f2,如果未找到,再去子类空间范围内查找,最后再去父类空间范围内查找。

Foo.f2
Bar.f1

子类的方法__init__()

在既有类的基础上编写新类的时候,通常要调用父类的方法__init__(),这将初始化再父类__init__()方法中定义的所有属性,从而让子类包含这些属性。

举例:

#定义一个父类Car,父类又名超类,名称super由此而来
class Car:
    def __init__(self,make,model,year):
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading=0
    def get_descriptive_name(self):
        long_name=f"{self.year} {self.make} {self.model}"
        return  long_name.title()
    def read_odometer(self):
        print(f"this car has {self.odometer_reading} miles on it ")
    def update_odometer(self,mileage):
        if mileage>=self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print("you can't roll back an odometer!")
    def increment_odometer(self,miles):
        self.odometer_reading+=miles
#定义一个子类ELectricCar,创建子类时,父类必须包含在当前的文件,父类必须位于子类的前面
class ELectricCar(Car):#定义子类时,必须在圆括号内指定父类的名称
   #方法__init__()接受创建Car实例所需的信息
    def __init__(self,make,model,year):
        print("__init__()方法被调用")
        #让python调用Car类的方法__init__(),让子类创建的实例包含父类这个方法中定义的所有属性
        super().__init__(make,model,year)#super是一个特殊函数,使我们能够调用父类的方法
my_tesla=ELectricCar('tesla','model s',2019)
print(my_tesla.make)
print(my_tesla.year)
print(my_tesla.model)
print(my_tesla.get_descriptive_name())
__init__()方法被调用
tesla
2019
model s
2019 Tesla Model S

对于上述代码,我们只是想查看子类ELectricCar是否继承了父类Car所拥有的属性,但是子类本身,我们并没有给他设置自身属性和方法。

给子类定义属性和方法:

让一个类继承另一个类后,就可以添加区分子类和父类所需的新属性和新方法了。

下面来添加一个电动车特有的属性,以及描述该属性的方法:

依然选用上面的代码:

#定义一个父类Car,父类又名超类,名称super由此而来
class Car:
    def __init__(self,make,model,year):
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading=0
    def get_descriptive_name(self):
        long_name=f"{self.year} {self.make} {self.model}"
        return  long_name.title()
    def read_odometer(self):
        print(f"this car has {self.odometer_reading} miles on it ")
    def update_odometer(self,mileage):
        if mileage>=self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print("you can't roll back an odometer!")
    def increment_odometer(self,miles):
        self.odometer_reading+=miles
#定义一个子类ELectricCar,创建子类时,父类必须包含在当前的文件,父类必须位于子类的前面
class ELectricCar(Car):#定义子类时,必须在圆括号内指定父类的名称
   #方法__init__()接受创建Car实例所需的信息
    def __init__(self,make,model,year):
        print("__init__()方法被调用")
        #让Python调用Car类的方法__init__(),让子类创建的实例包含父类这个方法中定义的所有属性
        super().__init__(make,model,year)#super是一个特殊函数,使我们能够调用父类的方法
        self.battery_size=75
    def describle_battery(self):
        print(f"this car a {self.battery_size}-kwl battery")
my_tesla=ELectricCar('tesla','model s',2019)
print(my_tesla.get_descriptive_name())
my_tesla.describle_battery() 

这时,我们给子类添加了它的专有属性describle_battery_size:

#__init__()方法被调用
2019 Tesla Model S
this car a 75-kwl battery

下面我们主要对新添加的子类专有属性进行分析:

  def __init__(self,make,model,year):
        print("__init__()方法被调用")
        #让python调用Car类的方法__init__(),让子类创建的实例包含父类这个方法中定义的所有属性
        super().__init__(make,model,year)#super是一个特殊函数,使我们能够调用父类的方法
        self.battery_size=75
def describle_battery(self):#关于子类ELectricCar特有的描述
        print(f"this car a {self.battery_size}-kwl battery")

self.battery_size=75为子类特有属性,因此写在子类的__init__()方法后,根据子类ELectricCar创建的所有实例都将把包含该属性,但所有的Car实例都不包含它。

对于子类的特殊程度没有任何限制,模拟子类ELectricCar时,可根据所需的准确程度添加任意数量的属性和方法。

如果一个属性或方法是任何汽车都有的,而不是子类ELectricCar特有的,就将应将其加入到父类Car中,而不是加入到子类ELectricCar中,这样,使用父类Car类的人将获得相应的功能,而使用子类ELectricCar的人只能获得子类特有的属性。

重写父类的方法

对于父类的方法,只要他不符合子类模拟的实物的行为,都可以进行重写,为此。可在子类中定义一个与要重写的父类方法同名的方法,这样,python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。

举例:

假设父类Car有一个名为fill__gas__tank()的方法,他对于子类ELectricCar来说毫无意义,因此你可能想重写它,那该怎么重写呢?
可在子类中定义一个与要重写的父类方法同名的方法

class Car:
  ---snip:
    def fill_gas_tank(self):
        self.fill_gas_tank=90
        print(f"电瓶车邮箱尺寸的大小是{self.fill_gas_tank}")
class ELectricCar(Car):
    --snip:
    def fill_gas_tank(self):#与父类中该属性的方法名相同
        print("this car doesn't need a gas tank!")
my_tesla=ELectricCar('tesla','model s',2019)
print(my_tesla.get_descriptive_name())
my_tesla.fill_gas_tank()

将父类改写之后,输出的不符合子类ELectricCar的方法的相关行为是我们改写后的,如果不进行改写,那么则会输出不相关的属性行为。

#__init__()方法被调用
2019 Tesla Model S
this car doesn't need a gas tank!

将实例用作属性

使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长,在这种情况下,可能需要将类的一部分提取出来,作为一个单独的类,可以将大型类拆分成多个协同工作的小类。

例如,不断给子类ELectricCar添加细节时,我们可能发现其中包含很多专门针对汽车电池的属性和方法,在这种情况下我们可以将这些属性和方法提取出来,放在一个名为battery的类中,并将一个battery实例作为子类ELectricCar的属性:

举例:

class Car:
    --snip--
class Battery:#这里是重写一个类
    def __init__(self,battery_size=10):#该默认值可设定也可不设定
        self.battery_size=battery_size
    def describle_battery(self):
        print(f"this car has a {self.battery_size}-kwl battery")
class ELectricCar(Car):
    def __init__(self,make,model,year):
        super().__init__(make,model,year)
        self.battery=Battery()#在子类ELectricCar新添加了一个名为battery的属性
        #让python创建一个新的Battery实例,并将该实例赋给属性新创建的属性battery
my_tesla=ELectricCar('tesla','model s',2019)
#和上面描述电池容量是一样的方法
my_tesla.battery.describle_battery()#让python在实例my_tasla中查找属性battery,并对battery进行调用

下面我们再向Battery类中添加一个方法用来描述电瓶车的航行距离:

class Car:
   --snip--
class Battery:
   --snip--
    def get_range(self):
        if self.battery_size==75:
            range = 260
        elif self.battery_size==100:
            range = 315
        print(f"this car can Go about {range} miles on a full charge")
class ELectricCar(Car):
   --snip--
my_tesla=ELectricCar('tesla','model s',2019)
my_tesla.battery.describle_battery()
my_tesla.battery.get_range()#在my_tesla实例中查找battery,self.battery=Battery(),对Battery进行调用
#__init__被调用
this car has a 75-kwl battery
this car can go about 260 miles on a full charge

到此这篇关于python重写方法和重写特殊构造方法的文章就介绍到这了,更多相关python重写内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python重写方法和重写特殊构造方法

本文链接: https://lsjlt.com/news/119472.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python重写方法和重写特殊构造方法
    目录继承多继承的优缺点子类的方法__init__()重写父类的方法将实例用作属性继承 编写类时,并非总是要从空白开始,如果编写的类是另一个现成类的特殊版本,可使用继承,继承分为单继承...
    99+
    2024-04-02
  • JAVA继承、构造方法、重写和重载方法怎么用
    本文小编为大家详细介绍“JAVA继承、构造方法、重写和重载方法怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JAVA继承、构造方法、重写和重载方法怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。构造方...
    99+
    2023-06-30
  • java构造方法可不可以重写
    在Java中,构造方法(Constructor)与其他方法一样,也可以被重载(Overload),但它不能被重写(Override)...
    99+
    2023-10-26
    java
  • Java构造方法和方法重载有什么特点
    这篇文章主要介绍了Java构造方法和方法重载有什么特点的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java构造方法和方法重载有什么特点文章都会有所收获,下面我们一起来看看吧。类的结构包括 : 成员变量 成员方...
    99+
    2023-06-26
  • Java面向对象之继承、构造方法、重写、重载
    目录构造方法无参构造有参构造注意类的继承方法重写、重载重写重载构造方法 类的构造方法是特殊的方法,此方法名称必须和类名一致,构造不能有返回值 不使用void,不能直接调用,在类对象实...
    99+
    2023-03-24
    Java面向对象 Java继承 Java构造方法 Java重写 Java重载
  • golang重写方法
    随着软件开发技术的发展,不断出现了一些新的编程语言和框架。作为目前最流行的编程语言之一,Golang已经被越来越多的开发者所熟知和使用。在Golang中,有许多方法可以实现同样的功能,但有时候你可能需要重新编写已有的方法,以提高性能或者更好...
    99+
    2023-05-16
  • golang 方法重写
    Golang是一种现代的编程语言,它的设计理念非常简洁、高效。在Golang中,方法重写是一个非常重要的概念,特别是在面向对象编程中。方法重写可以帮助我们避免出现代码重复的问题,提高程序的复用性和可维护性。方法重写是指在子类中对父类中已有的...
    99+
    2023-05-16
  • 重写 Pop() 方法
    php小编香蕉今天为大家介绍如何重写 Pop() 方法。在编程中,Pop() 方法用于删除并返回数组的最后一个元素。然而,有时我们需要对Pop()方法进行自定义,以满足特定需求。通过重...
    99+
    2024-02-10
  • Java构造方法和方法重载详解
    目录第一 构造方法的作用第二 构造方法的特点方法重载总结类的结构包括 : 1. 成员变量 2. 成员方法 3. 构造方法 4. 代码块 5. 内部类 第一 构造方法的作用 主要有以下...
    99+
    2024-04-02
  • Java中方法重写和方法重载的6个区别
    一、定义 方法重载(Overloading):在同一个类中,方法名相同但参数类型、参数个数不同的方法之间的关系。 方法重写(Overriding):在子类中,有相同的方法名、参数类型、参数个数并且返回类型兼容的方法称之为...
    99+
    2023-10-29
    方法 重写 区别
  • 如何重写hashcode和equals方法
    目录如何重写hashcode和equals方法Object源码理解需要重写equals()的场景需要重写hashcode()的场景原理分析补充HashMap知识hashcode方法文...
    99+
    2024-04-02
  • Java面向对象之继承、构造方法、重写、重载怎么实现
    这篇“Java面向对象之继承、构造方法、重写、重载怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java面向对象之继...
    99+
    2023-07-05
  • java中重写equals()方法的同时要重写hashcode()方法(详解)
    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;注意:当此方法被重写时,通常有必要重写 hashCod...
    99+
    2023-05-31
    java equals hashcode
  • Python类的继承和方法重写总结
    Python类的继承和方法重写总结  我们都知道类可以继承,通过继承可以实现代码的复用,使代码看起来更加简洁 比如:Class B(A): Pass 定义了一个名为B的类,它继承于A,我们把B叫做A的子类,A叫做B的超类(父类)。 方法重写...
    99+
    2023-01-31
    重写 方法 Python
  • equals、hashCode、toString方法重写
    equals 方法重写的规则判断一定相等(引用一致)判断一定不等(类型不一致)判断可能相等(需要把当前的对象给强转之后进行比较)hashCode 重写规则根据当前对象的唯一标识进行重写如果为空就直接返回0,不为空就返回唯一标识的 hashC...
    99+
    2020-06-25
    java教程 equals hashCode toString java
  • 怎么重写Equals方法
    这篇文章主要讲解了“怎么重写Equals方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么重写Equals方法”吧!equals与hashcode的存在...
    99+
    2024-04-02
  • Java方法重载和方法重写的区别到底在哪?
    方法重载和方法重写的区别 方法重载 方法重载的主要是在一个类当中,方法的方法名相同,参数列表不同,返回值类型可以相同,也可以不同. public class Demo{ pu...
    99+
    2024-04-02
  • Java构造方法的定义和重载
    本篇内容介绍了“Java构造方法的定义和重载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 一、构造方法的定义(一)什么构造方法实...
    99+
    2023-06-15
  • Java和JVM的重载和重写方法是什么
    本文小编为大家详细介绍“Java和JVM的重载和重写方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java和JVM的重载和重写方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.案例void&...
    99+
    2023-06-28
  • Java如何构造DSL方法重构
    目录DSL特点小结DSL Domain-specific language: 一种专注于某一领域,仅针对部分表达方式的计算机编程语言。 特点 方法链 Method Chaining功...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作