在父类中访问子类变量

2024-03-23

在父类中访问子类的变量是否正确?这是一种好的 OOP 方法吗?我不需要创建 Animal 类的实例,但如果我愿意的话,make_sound方法会提高AttributeError,这让我很困扰。

class Animal:
    def make_sound(self):
        print(self.sound)

class Cat(Animal):
    sound = 'meow'

class Dog(Animal):
    sound = 'bark'

cat = Cat()
cat.make_sound()

dog = Dog()
dog.make_sound()

这种方法本质上没有什么问题。这实际上取决于此类的范围和重要性以及它的使用位置。构建父类以使用隐式定义的属性非常快,并且在许多情况下完全没问题。但是,有时这些隐式属性可能会失控,您可能希望确保任何创建新子类的人has来定义这些属性。

有几种方法可以实现这一点。其中一些可能不起作用,具体取决于您使用的 Python 版本。我相信像这样的 ABC 用法可以在 Python 3.4+ 中使用。

Python(以及许多面向对象语言)有一个概念抽象基类 https://docs.python.org/3/library/abc.html。这是一个永远无法实例化的类,它强制任何子类必须实现定义为抽象的方法或属性才能实例化。

您可以通过以下方式提供make_sound方法,并且仍然 100% 确定任何对 Animal 进行子类化的人确实发出了这种声音。

from abc import ABC, abstractmethod


class Animal(ABC):

    def make_sound(self):
        print(self.sound)

    @property
    @abstractmethod
    def sound(self):
        """ return the sound the animal makes """


class Dog(Animal):

    @property
    def sound(self):
        return "bark"


class Cat(Animal):

    sound = "meow"


class Thing(Animal):
    """ Not an animal """

dog = Dog()
dog.make_sound()
cat = Cat()
cat.make_sound()
# thing = Thing()   this will raise a TypeError, complaining that its abstract
# animal = Animal()   as will this

这显示了执行此操作的许多不同方法。使用@property装饰器允许您设置影响它的实例变量或更复杂的逻辑。在类中设置声音(有点)类似于在 Java 类中设置静态成员。由于所有的猫都会喵喵叫,因此在这种情况下这可能是有道理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在父类中访问子类变量 的相关文章

  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • 指示电子邮件的类型

    我有以下自动化程序 它将电子邮件发送给我自己 并添加了特定的链接 import win32com client as win32 import easygui import tkinter as to from tkinter import
  • R参考类问题

    我正在尝试在 R 中创建一个简单的参考类 这是我的代码 R 初学者 MyClass lt setRefClass MyClass fields list a numeric b numeric methods list initialize
  • 检查 python 中命令行参数的数量

    我是蟒蛇新手 还是把脚弄湿了 我正在尝试做这样的事情 import sys if len sys argv lt 3 or lt len sys argv gt 3 print This script will compare two fi
  • 使用 Pytest 的参数化添加测试功能的描述

    当其中一个测试失败时 可以在测试正在测试的内容的参数化中添加描述 快速了解测试失败的原因 有时您不知道测试失败的原因 您必须查看代码 通过每个测试的描述 您就可以知道 例如 pytest mark parametrize num1 num2
  • 是否有一个包可以维护所有带有符号的货币列表?

    是否有一个 python 包提供所有 或相当完整 货币的列表与符号 如美元的 有优秀的pycountry 贪财的 https github com limist py moneyed and ccy http code google com
  • 如何将 sql 数据输出到 QCalendarWidget

    我希望能够在日历小部件上突出显示 SQL 数据库中的一天 就像启动程序时突出显示当前日期一样 在我的示例中 它是红色突出显示 我想要发生的是 当用户按下突出显示的日期时 数据库中日期旁边的文本将显示在日历下方的标签上 这是我使用 QT De
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • python 中的 h2o 框架子集

    如何在 python 中对 h2o 框架进行子集化 如果 x 是一个 df 并且 Origin 是一个变量 那么在 pandas 中我们通常可以通过以下方式进行子集化 x x Origin AAF 但使用 h2o 框架会出现以下错误 H2O
  • 时间序列数据预处理 - numpy strides 技巧以节省内存

    我正在预处理一个时间序列数据集 将其形状从二维 数据点 特征 更改为三维 数据点 时间窗口 特征 在这样的视角中 时间窗口 有时也称为回顾 指示作为输入变量来预测下一个时间段的先前时间步长 数据点的数量 换句话说 时间窗口是机器学习算法在对
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • 为什么在Python解释器中输入_会返回True? [复制]

    这个问题在这里已经有答案了 我的翻译行为非常奇怪 gt gt gt True gt gt gt type True
  • pygame:使用 sprite.RenderPlain 绘制精灵组的顺序

    我有一个精灵组 需要按一定的顺序绘制 以便其精灵按应有的方式重叠 然而 即使使用运算符模块函数 sorted self sprites key attrgetter y x 对组进行排序 顺序也是错误的 我该如何解决这个问题 直截了当地说
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • 使用 suds SOAP 库进行 HTTP 身份验证的奇怪行为

    我有一个正在运行的 python 程序 它使用 suds 通过 SOAP 获取大量数据 Web服务是通过分页功能实现的 这样我就可以抓取nnn每个 fetch 调用的行并获取下一个nnn与后续的电话 如果我使用如下代码向 HTTP 服务器进
  • 确定分割形状几何体的“左”侧和“右”侧

    我的问题是 我怎样才能确定哪一个Aside and Bside的侧面已经分割的旋转矩形几何体 http nbviewer jupyter org urls dl dropbox com s ll3mchnx0jwzjnf determine
  • PyInstaller“ValueError:源代码字符串不能包含空字节”

    我得到了一个ValueError source code string cannot contain null bytes执行命令时pyinstaller main py在具有和不具有管理员权限的cmd中 Traceback most re
  • 在 numpy 中连接维度

    我有x 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 2 3 I want 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 6 也就是说 我想连接中间维度的所有项目 在这种特殊情况下我可以得到这
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • 使用 paramiko 运行 Sudo 命令

    我正在尝试执行sudo使用 python paramiko 在远程计算机上运行命令 我尝试了这段代码 import paramiko ssh paramiko SSHClient ssh set missing host key polic

随机推荐

  • ServletContextListener 中的 @Autowired

    我有一个类初始化应用程序 Component public class InitApp implements ServletContextListener Autowired ConfigrationService weatherConfS
  • 右值 hello world 缺少构造函数

    我试图了解更多有关右值引用的信息 但我陷入了这个最简单的示例 include
  • java 14 nullpointerException没有详细消息

    Java 14 有许多新特性 其中之一是在 NullPointerException 中显示详细消息 我安装了 Java 14 并尝试在类下编译和运行 但没有收到任何详细消息 我错过了什么吗 请帮忙 code demo temp java
  • 内存管理:NSString的stringWithCString:encoding:

    假设我从某个函数获取一个 C 字符串 char mystring SomeCFunction 我拥有这个字符串 我负责在完成后释放它 如果在 Objective C 中 我创建一个NSString using NSString mynsst
  • Laravel 5.1 iframe 中的 CSRF,如何使其工作?

    我的应用程序有一个插件 用户可以在包含表单的网站中实现该插件 问题是我得到TokenMismatchException提交表格时 从我所做的所有研究中 我可以看到 Laravel 对跨域的保护 我知道我可以禁用它 但我不知道之后如何保护表单
  • Python Selenium driver.implicitly_wait(30)

    我们使用 VM 进行开发 并使用 Jenkins 作为套件 今天早上 我们在硒测试中遇到了以前从未发生过的问题 在粘贴代码之前 重要的是要知道 selenium 测试在我的机器上有效 但在 Jenkins 上失败 而且它已经工作了一个月 c
  • 如何使用 selenium 执行网页上的所有 javascript 内容,以在完全加载的网页上查找并发送登录表单信息

    我一直在尝试制作一个 Python 脚本来登录某个网站 浏览菜单 填写表单并将其生成的文件保存到文件夹中 我一直在使用 Selenium 尝试使网站完全加载 以便我可以找到登录的元素 但我没有成功 可能是因为网站在完全加载之前执行了大量 J
  • 自定义架构名称的宏不适用于 dbt 包

    我在 dbt 包中使用自定义架构名称时遇到问题 我使用中提供的宏数据库测试文档 https docs getdbt com docs building a dbt project building models using custom s
  • 如何使用 HQL 返回 Map

    我有一张桌子 允许 id name desc 我现在在做什么 是进行返回权限对象的查询 然后以编程方式将值放入映射中 1 但我想知道是否可以制作 HQL 如果不可能 则制作本机 sql 来选择权限ID 权限名称并将它们返回到地图中 2 是否
  • 为什么 Azure Function v2 无法绑定到 CloudTable?

    我正在尝试在 Visual Studio 2019 中运行 HTTP 触发的 v2 函数 应该是写出它的输出存储到名为 历史记录 的 Azure 存储表中 我用以下方法装饰了我的函数 return Table history 我让它返回一个
  • 无法反序列化 ActorRef 以将结果发送到不同的 Actor

    我开始使用 Spark Streaming 来处理我收到的实时数据源 我的场景是 我有一个使用 with ActorHelper 的 Akka actor 接收器 然后我让 Spark 作业执行一些映射和转换 然后我想将结果发送给另一个 a
  • 即使未移动,Motionevent Action_MOVE 仍会持续触发 X 和 Y

    我正在尝试一个简单的程序 如果移动的话 它会发出声音 所以一开始我就下了 播放声音 1 从那时起 每一个动作都会持续播放声音 在计数 4 时 我已经从头开始播放了 问题是 当我不移动手指并将其放在同一个地方时 声音仍然保持 1 x 1 计算
  • 有没有办法自动将Matlab 中的结果或数据导入到Mathematica 中?

    有没有办法将结果或数据 例如矩阵 从Matlab导入到Mathematica自动地 或者有什么方法可以先运行Matlab程序 然后运行Mathematica程序自动地 感谢您提供任何有用的答案 至少有三种方法可以解决这个问题 通过 Java
  • Actors 中 future 的执行上下文

    我有一个 Actor 并且在某些消息上我正在运行一些返回 Future 的方法 def receive Receive case SimpleMessge gt val futData Future Int futData map data
  • json_encode 输出对象而不是某些元素的数组

    我有这个数组 我想将其编码为 json Array 0 gt Array 0 gt Hour 1 gt bteam pvp 2 gt crackpack 3 gt tppi 4 gt agrarian plus 5 gt agrarian2
  • protobuf 取出部分数据的安全性如何?

    在没有任何加密的情况下 如果接收者拥有序列化的 Protobuf 文件 但没有生成的 Protobuf 类 他们无权访问定义其结构的 proto 文件 他们是否有可能获取 Protobuf 中的任何数据来自二进制文件 如果他们有权访问 pr
  • CFBundleVersion 必须高于以前的版本

    我正在提交我的一个应用程序的更新 我已经用我开发的许多不同的应用程序完成了数十次这样的操作 但是这个应用程序由于某种奇怪的原因而失败了 我存档我的应 用程序 然后尝试验证存档并收到以下错误消息 该捆绑包无效 Info plist 文件中的关
  • 在 python 中生成非子进程

    我需要在 python 中创建一个进程 允许调用进程在子进程仍在运行时退出 什么是有效的方法来做到这一点 注意 我在 UNIX 环境上运行 在类 Unix 操作系统中 终止父进程不会终止子进程 因此您不需要执行任何特殊操作 只需启动你的子流
  • React'findNodeHandle 方法停止工作

    升级到后0 26 0 rc版本 这一行 React findNodeHandle this refs myRef 抛出此错误消息 未处理的 JS 异常 react2 default findNodeHandle 不是 功能 我用这个导入 R
  • 在父类中访问子类变量

    在父类中访问子类的变量是否正确 这是一种好的 OOP 方法吗 我不需要创建 Animal 类的实例 但如果我愿意的话 make sound方法会提高AttributeError 这让我很困扰 class Animal def make so