当前位置: 首页 > 面试题库 >

如何使用父__new__中的一些魔术来创建子类实例?

帅银龙
2023-03-14
问题内容

例如,在以下层次结构中创建自定义数字类型

  • Number
    • Complex
    • Real
    • Int
    • Float

__new__方法中具有逻辑:

class Number:
    def __new__(cls, value):
        if isinstance(value, complex):
            return Complex(value)
        elif isinstance(value, (int, float)):
            return Real(value)
        else:
            raise TypeError('Ну ты и мудак!!!')

    def __init__(self, value):
        self.value = value


class Complex(Number):
    pass


class Real(Number):
    def __new__(cls, value):
        if isinstance(value, int):
            return Int(value)
        elif isinstance(value, float):
            return Float(value)
        else:
            raise TypeError('Ты больше не можешь вести себя так!!!')


class Int(Real):
    pass


class Float(Real):
    pass

然后,Float使用Number构造函数创建实例:

number = Number(6.6)
assert isinstance(number, Float)

RuntimeError由于递归限制,此代码将提高。这只是期望行为的示例。但是我也尝试使用这种方法来实现super,似乎我误解了世界。


问题答案:

ComplexFloatInt类也 不能__new__方法,让他们继承这些从Number; 这就是导致您无限递归的原因。

您可以针对__class__闭包进行测试,以查看是否具有子类:

class Number:
    def __new__(cls, value):
        if cls is not __class__:
            # Subclass, create an instance (invokes object.__new__)
            return super().__new__(cls)

        if isinstance(value, complex):
            return Complex(value)
        elif isinstance(value, (int, float)):
            return Real(value)
        else:
            raise TypeError('Ну ты и мудак!!!')

    def __init__(self, value):
        self.value = value

并在Real

class Real(Number):
    def __new__(cls, value):
        if cls is not __class__:
            # Subclass, create an instance
            return super().__new__(cls, value)

        if isinstance(value, int):
            return Int(value)
        elif isinstance(value, float):
            return Float(value)
        else:
            raise TypeError('Ты больше не можешь вести себя так!!!')

演示:

>>> class Number:
...     def __new__(cls, value):
...         if cls is not __class__:
...             # Subclass, create an instance
...             return super().__new__(cls)
...         if isinstance(value, complex):
...             return Complex(value)
...         elif isinstance(value, (int, float)):
...             return Real(value)
...         else:
...             raise TypeError('Ну ты и мудак!!!')
...     def __init__(self, value):
...         self.value = value
... 
>>> class Real(Number):
...     def __new__(cls, value):
...         if cls is not __class__:
...             # Subclass, create an instance
...             return super().__new__(cls, value)
...         if isinstance(value, int):
...             return Int(value)
...         elif isinstance(value, float):
...             return Float(value)
...         else:
...             raise TypeError('Ты больше не можешь вести себя так!!!')
... 
>>> class Complex(Number):
...     pass
... 
>>> class Int(Real):
...     pass
... 
>>> class Float(Real):
...     pass
... 
>>> number = Number(6.6)
>>> isinstance(number, Float)
True


 类似资料:
  • 问题内容: 我的任务是编写一个询问用户输入的程序,该方法将返回输入是否形成幻方。无论我输入到控制台什么,程序都会返回我输入了一个魔术方块。我想念什么? 幻方定义:如果行,列和对角线的总和相同,则二维数组就是幻方。 问题答案: 您没有保存输入的内容,因此将0x0 square传递给。 许多方面的实现是错误的。 条件应该是。 您只需要在计算完成后检查即可。 您必须先进行初始化,然后再计算它们。 您应该

  • 我写了这个,但我不明白这是什么。

  • 问题内容: 我必须编写一个程序,该程序需要用户输入一个奇数并创建一个幻方。幻方是指行,列和对角线的总和相同的正方形。这些是编写代码的特征: 向用户询问一个奇数 创建一个n x n数组。 请按照以下步骤创建一个魔术方块。 一个。在第一行的中间放置一个1。 b。从行中减去1,然后在列中加1。 一世。如果可能,将下一个数字放在该位置。 ii。如果不可能,请按照下列步骤操作。 如果在第-1行,则更改为最后

  • 本文向大家介绍Python中的__new__与__init__魔术方法理解笔记,包括了Python中的__new__与__init__魔术方法理解笔记的使用技巧和注意事项,需要的朋友参考一下 很喜欢Python这门语言。在看过语法后学习了Django 这个 Web 开发框架。算是对 Python 有些熟悉了。不过对里面很多东西还是不知道,因为用的少。今天学习了两个魔术方法:__new__ 和 __

  • 问题内容: 我正在创建一个类及其子类,需要在其中调用父级的静态方法以返回子级实例。 问题答案: 该静态方法被调用,其值是类对象,子类,你把它称为后的构造。因此,您可以使用实例化它:

  • 当我们实例化子类对象时,父类的构造函数也会被调用。那么它是父类的对象的创建吗?