python3.8中的最终注释和装饰器

2024-04-16

由于 Python 3.8 即将发布,我只是想知道两者之间的区别最终装饰器和最终注释.


在 Python 3.8 中,Python 类型提示功能(体现为typing module https://docs.python.org/3/library/typing.html) 将支持将名称标记为final。这记录在PEP 591 –在输入中添加最终限定符 https://www.python.org/dev/peps/pep-0591/.

这意味着typing模块获得两个新对象:

  • The typing.Final打字构造 https://docs.python.org/3.8/library/typing.html#typing.Final
  • The @typing.final()装饰者 https://docs.python.org/3.8/library/typing.html#typing.final.

预先:Python语言本身并没有获得final语法或支持。上述对象不会改变 Python 的工作方式,它们的构造是仅仅记录对象或引用被视为最终的。新对象可以轻松向后移植到较旧的 Python 版本。这typing-extensions project https://pypi.org/project/typing-extensions/,它提供了向后移植typing从较新的 Python 版本到较早的 Python 版本的功能,已经包含这些对象 https://github.com/python/typing/commit/c6c7dfdd4b999a2bbd46d120adeacc504d74e044.

它们的用途在于使用类型提示checker like mypy https://docs.python.org/3.8/library/typing.html#typing.final检查您的项目是否正确地将记录的对象视为最终对象。

它们的使用在其他方面与finalJava中的关键字 https://en.wikipedia.org/wiki/Final_(Java):声明特定引用只能分配给once,方法不能在子类中重写,或者类定义不能被子类化。

  • Use the typing.Final对象将全局或属性标记为最终,记录该值一旦分配给就永远不会改变:

      GLOBAL_CONSTANT: Final[str] = "This is a constant value because it is final"
    
  • Use the @typing.final装饰器将方法标记为不可重写(子类不能定义不同的实现)或将类标记为不可继承(不能从该类创建子类):

      @final
      class FinalClass:
          """This class can't be inherited from"""
    
      class SomeClass:
          @final
          def final_method(self):
              """Subclasses can't define a different final_method implementation"""
    

另请参阅mypy 的使用文档 https://mypy.readthedocs.io/en/latest/final_attrs.html,其中涵盖了如何分配 a 值的详细信息Final属性是可以接受的。

Demo:

$ cat demo.py
from typing import final, Final

# FOO is marked final, can't assign another value to it
FOO: Final[int] = 42

class Foo:
    @final
    def spam(self) -> int:
        """A final method can't be overridden in a subclass"""
        return 42

@final
class Bar:
    """A final class can't be subclassed"""

# Rule breaking section
FOO = 81

class Spam(Foo, Bar):
    def spam(self) -> int:
        return 17

if __name__ == '__main__':
    print("FOO:", FOO)
    print("Spam().spam():", Spam().spam())

$ python3.8 demo.py   # Python will not throw errors here
FOO: 81
Spam().spam(): 17
$ mypy demo.py        # only a type checker will
demo.py:17: error: Cannot assign to final name "FOO"
demo.py:19: error: Cannot inherit from final class "Bar"
demo.py:20: error: Cannot override final attribute "spam" (previously declared in base class "Foo")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3.8中的最终注释和装饰器 的相关文章

随机推荐

  • Django Rest Framework 自定义响应消息

    我有两个关于 Django Rest Framework 响应消息的问题 1 使用时generics ListCreateAPIView or RetrieveDestroyAPIView 通常返回一个资源 例如 使用 POST 方法调用
  • Haskell 中的简单合并排序并行化没有加速

    注 这篇文章于2011 06 10完全重写 感谢彼得帮助我 另外 如果我不接受一个答案 请不要生气 因为这个问题似乎是相当开放式的 但是 如果你解决了它 当然你会得到复选标记 另一位用户发布了有关并行化合并排序的问题 我以为我会写一个简单的
  • 如果我输入文本框 1,3 那么 checkbox1 和 checkbox3 将被禁用而不被选中!

    如果我输入文本框 1 3 那么 checkbox1 和 checkbox3 将被禁用而不被选中 我在下面提供的编码正在工作 但是 它根据文本框中的文本检查 cjeckoxes 即 1 3 然后将检查 checkbox1 和 checkbox
  • UnknownFieldException - 没有这样的字段

    当我尝试使用 xstream 将 xml 文件编组到 POJO 中时 我不断收到此错误 我不确定发生了什么 可以用新的眼光来看待事物 Exception in thread main com thoughtworks xstream con
  • java 中 (--i + ++i) 中表达式的输出

    int i 9 System out println i i 执行输出 17i 的最终值为 9 但是根据java中的结合性和优先级规则 i应该首先执行 即从右到左 给出10 然后 i给出9 将两者相加 答案应该是19 至于我知道这样的代码在
  • 在 OpenGL 着色器中检测 NaN 的最佳方法

    今天早上我遇到了一个似乎神秘的错误 我很幸运能够很快找到解决方案 我除以计数器以生成片段着色器内部的平均值 当然 当计数器为零时 所得的颜色值变为 NaN 在混合过程中 NVidia 优雅地将 NaN 视为 0 值 但 Intel 没有这样
  • 调试断言失败 OpenCv is_block_type_valid(header->_block_use)

    我是使用 Visual Studio 和 openCv 编程的新手 我编写了一个简单的程序来显示图像的红色通道 但每次运行代码时都会抛出 DEBUG ASSERTION FAILED 错误 include
  • jqGrid 复选框列

    我有一个相当复杂的网格 有两列格式化为复选框 这些列定义如下 name Alert A index Alert A width 22 align center sortable false formatter CheckBoxFormatt
  • 无法将简单的无符号字节 RGB 纹理映射到四边形:

    我有一个非常简单的程序 将虚拟红色纹理映射到四边形 下面是 C 中的纹理定义 struct DummyRGB8Texture2d uint8 t data 3 4 int width int height DummyRGB8Texture2
  • Spring Boot - 处理 JSON 或 HTML 的错误控制器

    我有一个春季启动应用程序 我有一个自定义错误控制器 它映射到使用ErrorPage映射 这些映射主要基于 HTTP 状态代码 并且通常只是适当地呈现 HTML 视图 例如我的映射 Configuration class ErrorConfi
  • 保存从 MS Access 2007 到 MS SQL Server 的 ODBC 连接的密码

    我负责将旧的 Access 2007 项目迁移到 MS SQL Server 2008 Express 第一阶段是将所有数据从 MS Access 数据库移动到 SQL Server 同时将 Access 表单和报告保留在客户端 因此 现在
  • 从中心生长[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我一直在尝试让底部的圆圈在 Firefox 中增长 需要添加其他前缀 仍在开发中 他们表现得很好 但我的目标是让他们从中
  • Spring MVC形式:选择选定的值?

    有没有办法通过 Spring MVC 在下拉列表中选择当前值
  • Django 表单字段中的 JavaScript 函数调用

    我想创建一个带有复选框的表单 单击时 它们会打开单独的文本区域 供用户输入更多信息 如果我想使用 Django 动态创建的表单字段 有没有一种方法可以为每个复选框添加一个函数调用 您可以使用 JavaScript 动态添加事件处理程序 您可
  • C# - WPF - 不使用 System.Windows.Forms 获取文件夹浏览器对话框?

    我有这个WPFapp 我想有从用户那里获取目录路径的功能 我想使用一些文件夹浏览器对话框 但我don t想要实施它System Windows Forms或者在里面使用一些巨大的脚本 WPF 中是否有一些已经实现的获取对话框的路径 我在这里
  • 使用命令行工具构建时如何添加 .jar 文件依赖项?

    非常简单的问题 不使用Ants或Maven可以完成吗 我特指的是命令行工具 请注意 我不想创建 uberjar 我只是希望存档单元 知道 其外部依赖项在哪里 假设您正在谈论命令行调用javac 您所说的是 我可以提供库作为 javac 的参
  • Qt QFileDialog - 仅具有静态函数的本机对话框?

    我试图简单地保存一个文件 但是 我需要输入一个不带后缀的文件名来自动获取默认后缀 setDefaultSuffix 会这样做 我不想为此完全失去本机保存对话框 exec 没有从 QDialog 重载 因此它完全绕过本机钩子 忽略 DontU
  • 从 vueJS 方法调用 setTimeout() 不起作用

    我试图允许用户从应用程序重置或关闭给定服务器 我现在正在开发界面 并希望向用户提供有关正在发生的事情的消息 我显示数据对象中定义的消息来指示所采取的操作 我使用 setTimeout 来切换重置 消息和重置消息 请参阅以下方法 system
  • 命令键的 jQuery 键代码

    我读过了jQuery 事件按键 按下了哪个键 https stackoverflow com questions 302122 jquery event keypress which key was pressed and 如何使用 jqu
  • python3.8中的最终注释和装饰器

    由于 Python 3 8 即将发布 我只是想知道两者之间的区别最终装饰器和最终注释 在 Python 3 8 中 Python 类型提示功能 体现为typing module https docs python org 3 library