例如,在以下层次结构中创建自定义数字类型
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
,似乎我误解了世界。
你Complex
,Float
而Int
类也 不能 有__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__ 和 __
问题内容: 我正在创建一个类及其子类,需要在其中调用父级的静态方法以返回子级实例。 问题答案: 该静态方法被调用,其值是类对象,子类,你把它称为后的构造。因此,您可以使用实例化它:
当我们实例化子类对象时,父类的构造函数也会被调用。那么它是父类的对象的创建吗?