当前位置: 首页 > 知识库问答 >
问题:

Python类型允许某个类的对象出现在同一个类的__init__中[重复]

屈宏爽
2023-03-14

我正在尝试创建一个名为主题的类,其__init__函数允许传入另一个对象,该对象可能是主题类型。但是当我尝试键入允许该类型对象的提示时,Python会抛出错误,因为主题尚未定义。这是代码,当我取出类型提示时有效:

from typing import Union


class Theme:

    def __init__(self, start: Union[dict, Theme, None] = None):
        if start is None:
            start = {}
        elif isinstance(start, Theme):
            start = start.dict
        self.dict = start

我得到的错误是:

Traceback (most recent call last):
  File "C:/Users/.../Test.py", line 4, in <module>
    class Theme:
  File "C:/Users/.../Test.py", line 6, in Theme
    def __init__(self, start: Union[dict, Theme, None] = None):
NameError: name 'Theme' is not defined

我有什么方法可以实现这一点吗?还是这是不可能的,我不应该费心?

共有1个答案

边永贞
2023-03-14

您可以从__future__导入批注。我认为在 3.10 中这是默认可用的。

from __future__ import annotations

from typing import Optional


class MyClass:
    def __init__(self, cls: Optional[MyClass]) -> None:
        if cls:
            print(isinstance(cls, MyClass))


c = MyClass(None)
b = MyClass(c)
 类似资料:
  • 为了Android的开发,我从Java切换到kotlin。当我在Kotlin中搜索Java静态方法的等价时,我发现同伴对象是。但问题是在Kotlin中创建多个静态方法时。我得到了这些错误,每个类只允许一个伴随对象。

  • 我发现的大部分stackoverflow结果都是用于序列化整个对象或反序列化的。我的一些想法… 是否可以从三个值字段中删除@SerializedName并只序列化不为null的值? 我是否可以在java中构建某种可选的数据类型对象,该对象基于具有值的数据类型进行设置? 这个对象是一个更大的对象的一部分,而subitems对象有一个相当大的深度,它只是一个注释。我希望这是一个重复的问题,我只是找不到

  • 下面的代码是一个基本的Angle对象的初始化方法,它的父类是浮动。 此类背后的思想是,您可以输入角度值,或者指定三个顶点(以及可选的角度类型参数)以自动计算角度。最后,自我。角度总是初始化的,这是进行所有运算的地方(因此会影响)。 它从继承的原因是继承了反射和增强赋值的神奇方法,这些方法都是在。 当试图为顶点输入三个值时,就会出现问题。由于它继承自,因此不能接受多个参数,因此会引发错误。我该如何解

  • 我有一个组件,根据其大小接收道具。道具可以是字符串或数字,例如:或。 我能让知道这可以是PropTypes验证中的一个或另一个吗? 如果未指定类型,则会收到警告: prop type无效;它必须是一个函数,通常来自React。道具类型。

  • rank ▲ ✰ vote url 68 354 80 465 url 查看一个对象的类型 有什么方便的方法查看一个对象的类型? 为了获得对象的类型,可以用内建函数type().把对象作为唯一的参数传递将会返回这个对象的类型: >>> type([]) is list True >>> type({}) is dict True >>> type('') is str True >>> type(

  • 假设我们有一个带有签名的函数 是否有可能实施一个约束来确保a和b是不同的?那就是 这个问题的目的是了解更多关于Haskell的信息,并可能解决我面临的一个设计问题。如果a==b,我的特殊情况是没有意义的,所以我想在编译器级别禁止这样做。我可能会用一个完全不同的设计来解决这个问题,但这不仅仅是现在的重点--潘多拉盒子已经打开,我想知道类型级别上的等式约束是否可能。