Python中构造方法的解析(附示例)

本篇文章给大家带来的内容是关于python中构造方法的解析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

Python中会看到前后都加双下划线的函数名,例如 __init__(self),这类写法在Python中具有特殊的含义。如果对象使用了这类方法中的某一个,那么这个方法将会在特殊的情况下被执行,然而几乎不会直接调用此类方法。

如果没有兼容旧版本Python代码的需要,我们在编写代码时应将所有类的写为新式类并且使用super函数这样的特性。

在Python3.0中没有”旧式”的类,也不需要侠士的子类化Object或者将元类设置为type(代码起始行__metaclass__=type).那是因为所有的类都是隐式的成为Object的子类。如果没有明确超类的话,就会直接子类化;否则间接子类化。

Python中的构造方法

立即学习“Python免费学习笔记(深入)”;

构造方法与其他方法不同,当一个对象被创建后,会立即调用构造方法。

重写一般方法和特殊的构造方法:

了解过继承的概念后我们知道,每个类都可能拥有一个或者多个超类,子类从父类那里继承父类的一些行为方式。不仅如此,我们也可以重写一些超类的方法来自定义继承行为。

class Bird:    def __init__(self):        self.hungry=True    def eat(self):        if self.hungry:            print('我在吃')            self.hungry=False        else:            print('我吃饱了,谢谢')sb=Bird()sb.eat()sb.eat()

登录后复制

打印结果:

我在吃我吃饱了,谢谢

登录后复制

通过代码可知道,鸟吃饱以后,将饥饿状态改为Flase,说明小鸟吃饱了,当在调用eat函数时候,则打印我吃饱了,谢谢。这是在通一个类中的__init__函数的使用。来看扩展案例。吃是鸟类的基本特征,可以将Bird作为鸟类的基类。现在我们写一个会唱歌的鸟,因为我们已经写好了一个鸟的基类,此时仅需继承它之后,我们的鸟不仅会唱歌而且默认的学会了吃的技能。

class Bird:    def __init__(self):        self.hungry=True    def eat(self):        if self.hungry:            print('ahhh')            self.hungry=False        else:            print('no thanks')class SongBird(Bird):    def __init__(self):        self.sound='Squawk'    def sing(self):        print(self.sound)sb=SongBird()sb.sing()sb.eat()sb.eat()

登录后复制

打印结果:

Traceback (most recent call last):Squawk  File "F:/Python培训/博客园随笔专用/文件操作/文件读写.py", line 20, in     sb.eat()  File "F:/Python培训/博客园随笔专用/文件操作/文件读写.py", line 5, in eat    if self.hungry:AttributeError: 'SongBird' object has no attribute 'hungry'

登录后复制

不幸的是,我们的鸟可以触发唱歌的功能,但当调用父类的吃的功能时,就抛出了异常。再看父类中定义的eat函数,启动eat函数需要设置hungry属性。但不解的是,我们已经继承了鸟的基类Bird,Bird里也定义了hungry为什么不起作用呢。那是因为hungry属性是在当父类调用自己的构造函数时才起作用。由此可见,SingBird继承了Bird的所有功能,却未触发Bird的初始化功能。修改以下代码

class Bird:    def __init__(self):        self.hungry=True    def eat(self):        if self.hungry:            print('ahhh')            self.hungry=False        else:            print('no thanks')class SongBird(Bird):    def __init__(self):        Bird.__init__(self)        self.sound='Squawk'    def sing(self):        print(self.sound)sb=SongBird()sb.sing()sb.eat()sb.eat()

登录后复制

 输出结果:

Squawkahhhno thanks

登录后复制

通过代码可以知道,我们在SongBird的初始化类时,调用了Bird的初始化函数。因此,Bird的构造函数得以触发。现在我们的鸟,不仅能唱歌而且具备基类中吃的行为。

再看它执行过程。SongBird在初始化自身的同时,又将自己作为参数传递给它的父类,也就是告诉父类,你在造我的时候,要赋予我天生的技能(自己知道温饱)。也就是hungry属性被设置。

使用Super函数

以上方法是3.0以前的写法,新式类中将使用super函数解决以上问题。

class Bird:    def __init__(self):        self.hungry=True    def eat(self):        if self.hungry:            print('ahhh')            self.hungry=False        else:            print('no thanks')class SongBird(Bird):    def __init__(self):        super(SongBird, self).__init__()        self.sound='Squawk'    def sing(self):        print(self.sound)sb=SongBird()sb.sing()sb.eat()sb.eat()

登录后复制

当前的类和对象被当做参数调用,而调用函数返回的对象的任何方法都是调用超类的方法。总结:显示的传递子类和子类对象并且调用构造函数但隐式的却是在执行父类的构造方法。

以上就是Python中构造方法的解析(附示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2260657.html

(0)
上一篇 2025年2月27日 05:45:35
下一篇 2025年2月24日 18:06:29

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python和163邮箱授权码发送邮件的分析与实现(代码)

    本篇文章给大家带来的内容是关于python和163邮箱授权码发送邮件的分析与实现(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 背景 前段时间写了个自动打卡的脚本,但是脚本不够完善,我需要知道,打卡到底成没成功,因…

    2025年2月27日
    200
  • Python下JSON和pickle的用法介绍(附代码)

    本篇文章给大家带来的内容是关于python下json和pickle的用法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一:简介 (1)JSON (JavaScript Object Notation) 是一…

    编程技术 2025年2月27日
    200
  • python如何实现决策树算法?(代码)

    本篇文章给大家带来的内容是关于python如何实现决策树算法?(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 数据描述 每条数据项储存在列表中,最后一列储存结果多条数据项形成数据集 data=[[d1,d2,d3.…

    编程技术 2025年2月27日
    200
  • Python中可迭代对象分解为单独的变量的实现方法(代码)

    本篇文章给大家带来的内容是关于python中可迭代对象分解为单独的变量的实现方法(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 现在有一个包含N个元素的元组或序列,现在想将它分解为N个单独的变量。 2、解…

    编程技术 2025年2月27日
    200
  • python中使用deque保留最新N个元素的实现方法(代码)

    本篇文章给大家带来的内容是关于python中使用deque保留最新n个元素的实现方法(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 做一个有限个数的历史记录。 2、解决方案 deque(maxlen=N)…

    编程技术 2025年2月27日
    200
  • python中找到最大或最小的N个元素的实现代码

    本篇文章给大家带来的内容是关于python中找到最大或最小的n个元素的实现代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们想在某个集合中找出最大或最小的N个元素 2、解决方案 heapq模块中有两个函数:…

    编程技术 2025年2月27日
    200
  • python如何实现优先级队列(附代码)

    本篇文章给大家带来的内容是关于python如何实现优先级队列(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们想要实现一个队列,它能够以给定的优先级来对元素排序,且每次pop操作时都会返回优先级最高的…

    编程技术 2025年2月27日
    200
  • python实现一键多值字典的方法实现

    本篇文章给大家带来的内容是关于python实现一键多值字典的方法实现,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们想要一个能将键(key)映射到多个值的字(即所谓的一键多值字典) 2、解决方案 字典是一种关…

    编程技术 2025年2月27日
    200
  • python如何让字典保持有序(代码)

    本篇文章给大家带来的内容是关于python如何让字典保持有序(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们想创建一个字典,同时当对字典做迭代或序列化操作时,也能控制其中元素的顺序。 2、解决方案 要…

    编程技术 2025年2月27日
    200
  • Python如何实现字典上对数据执行计算

    本篇文章给大家带来的内容是关于Python如何实现字典上对数据执行计算,例如:最大值、最小值、排序等,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们想在字典上对数据执行各式各样的计算,例如:最大值、最小值、排…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论