首页 > 编程问答 >Python:需要有关类方法的帮助

Python:需要有关类方法的帮助

时间:2024-08-05 14:58:07浏览次数:6  
标签:python

我有一个类“Duck”和“Dog”,如下所示:

class Duck:

    def quack(self):
        print("quack")

class Dog:

    def bark(self):
        print("I just bark")

以两种方式定义了另一个类并启动:

case:1

class ItQuacks:

    def __init__(self, animal):
        **animal.quack()**

如果我将其启动为 ItQuacks(Duck) ,则不会打印任何事物。我期待着“嘎嘎”被打印出来。而 ItQuacks(Duck()) 打印“quack”。

case:2

class ItQuacks:

    def __init__(self, animal):
        **animal.quack(self)**

但是如果我将其启动为 ItQuacks(Duck) ,它会按预期打印“quack”

我可以知道 Duck() 默认情况下是否有 self 。有人可以解释一下这个概念吗?


当然,让我们分解一下 Python 代码中的类方法和实例化。

核心概念

  • 类: 类就像蓝图,它定义了对象(如 Duck 和 Dog)的结构和行为。它们本身并不是对象。
  • 实例: 实例是根据类蓝图创建的实际对象。例如, Duck() 创建了一个 Duck 类的实例。
  • self self 是实例方法中的一个特殊参数,它指的是该方法所属的实例。它不是由你直接传递的,而是在你调用实例方法时由 Python 自动传递。

对你的代码的解释

  1. 案例 1: ItQuacks(Duck) vs. ItQuacks(Duck())

  2. ItQuacks(Duck) :这里,你将类 Duck 本身传递给了 ItQuacks 构造函数。你没有创建 Duck 的实例。由于你没有 Duck 的实例,因此没有可供 animal.quack() 操作的对象,因此没有任何内容被打印出来。

  3. ItQuacks(Duck()) :在这种情况下, Duck() 创建了一个 Duck 的新实例。这个实例被传递给 ItQuacks 的构造函数。在 ItQuacks __init__ 中, animal.quack() 现在指的是 Duck 实例上的 quack 方法,因此 "嘎嘎" 被打印出来。

  4. 案例 2: animal.quack(self)

  5. 此代码不正确,并且如果在 ItQuacks 类中像这样使用,则会引发错误。 Duck 类中的 quack 方法定义为:

    python def quack(self): print("quack")

  6. 它只需要 self 参数(由 Python 自动提供)。通过调用 animal.quack(self) ,你试图传递一个额外的参数,这会导致错误。

简而言之

  • 要使用 quack 方法等实例方法,你需要一个 Duck 的实例(例如, Duck() )。
  • self 由 Python 在实例方法中处理。你不必也不应该在调用实例方法时明确地传递它。

改进后的代码

要使 ItQuacks 类更加健壮,你可以修改它以接受一个 animal 实例,并检查它是否具有 quack 方法:

class ItQuacks:
    def __init__(self, animal):
        if hasattr(animal, 'quack'):
            animal.quack()
        else:
            print("This animal can't quack!")

my_duck = Duck()
it_quacks = ItQuacks(my_duck)  # 这将打印 "嘎嘎" 

这确保了仅当传入的对象实际具有 quack 方法时,才会调用该方法,从而防止了潜在的错误。

标签:python
From: 78832782

相关文章

  • 查找分层股东关系:在 python 中重构嵌套 if
    我想找到公司之间的股东关系。在下面的示例中,“人员1”直接拥有“公司1”50%的股份,那么需要检查“公司1”是否也拥有其他公司的股份。“公司1”拥有“公司2”50%的股份,“公司3”拥有20%的股份。这意味着“人员1”间接拥有“公司2”和“公司3”的部分股份。此......
  • 解决Python的pip问题:WARNING: Retrying (Retry(total=1, connect=None, read=None, re
    相关:pip安装第三方库报错Retrying(Retry(total=1,connect=None,read=None,redirect=None,status=None))国内镜像源下载常用国内源:清华:https://pypi.tuna.tsinghua.edu.cn/simple/阿里云:http://mirrors.aliyun.com/pypi/simple/中国科技大学https://pypi.mirrors.u......
  • Python,volcengine-python-sdk,安装失败,提示which is required to install pyproject.to
    问题描述:我是安装截止20240804发布的最新版本,volcengine-python-sdk-1.0.94.tar.gz报错一报错最后提示:whichisrequiredtoinstallpyproject.toml-basedprojects...note:Thiserrororiginatesfromasubprocess,andislikelynotaproblemwithpip.ERROR:Fai......
  • python_wholeweek3
    目录子函数的使用函数的定义嵌套的使用全局定义和局部定义子函数的使用函数的定义##############函数的三种定义方式##比较两个数大小,max是内置关键字,##第一种定义方式,无参函数#defself_max():#x,y=10,20##ifx>y:#print(x)#el......
  • Python实现简单的情感分析应用
    Python实现简单的情感分析应用情感的力量:走进情感分析的世界什么是情感分析:从日常对话到大数据分析情感分析的应用场景:从社交媒体到客户服务为何Python成为情感分析的最佳拍档准备工作:Python环境与必备库Python安装指南:快速搭建开发环境必不可少的库:nltk与TextBlob的简......
  • Python中的Web开发与API设计
    Python中的Web开发与API设计一、开篇:启航PythonWeb开发之旅1.1Python:不仅仅是脚本语言,更是Web开发的明星1.2Web开发的魔法森林:从静态到动态的转变二、基础篇:PythonWeb开发的基石2.1HTTP协议:互联网通信的通用语言2.2Flask框架:轻装上阵的小巧之选2.3Django框架:全......
  • Python实现简单的模型调优技术
    Python实现简单的模型调优技术一、开篇:模型调优的魅力所在1.1模型调优:不只是参数游戏1.2为什么好的模型也需要调优二、基础篇:理解模型调参的必要性2.1模型评估指标:选择合适的尺子2.2常见调参方法:从手动到自动化2.3验证集的重要性:不要让模型裸奔三、实战篇:动手......
  • SpringBoot-书店信息管理系统+93494(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP
    基于springboot书店信息管理系统摘 要书店信息管理系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分,管理员管理主要功能包括:首页、轮播图、公告栏、资源管理(图书资讯、资讯分类)交流管理(留言板、留言板分类)系统用户(管理员、顾客用户......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-63 - Canvas和SVG元素定位
    1.简介今天宏哥分享的在实际测试工作中很少遇到,比较生僻,如果突然遇到我们可能会脑大、懵逼,一时之间不知道怎么办?所以宏哥这里提供一种思路供大家学习和参考。2.SVG简介svg也是html5新增的一个标签,它跟canvas很相似。都可以实现绘图、动画。但是svg绘制出来的都是矢量图,不像canv......
  • 第十三章 -------------------WPF 和IronPython 联合编程
    1为什么我想用实现WPF和IronPython联合编程?我想解决的问题是利用已经写好的C#Class经过脚本的组合,使的原本单一的逻辑经过组合之后编程一个流程。我查阅了许多资料,也是参考了别人的代码。至于为什么要这么写我想来好多原因,其中最主要的原因可能就是为了适应程序的多变化S......