- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
from fractions import Fraction
class F1(Fraction):
def __init__(self, *args, **kwargs):
Fraction.__init__(*args, **kwargs)
class F2(Fraction):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Fraction(1, 10) # Fraction(1, 10)
F1(1, 10) # F1(1, 10)
F2(1, 10) # TypeError: object.__init__() takes exactly one argument (the instance to initialize)
这是怎么发生的?有人可以详细说明一下 super 功能吗?
Python 版本:3.8.10
最佳答案
TLDR; Fraction
使用 __new__
而不是 __init__
。
Python 对象分两步组装。首先,它们是用 __new__
创建的,然后用 __init__
初始化。通常我们使用默认的 object.__new__
来创建一个新的空对象,然后覆盖 __init__
来处理任何需要完成的特殊事情。
但是有些类想通过实现自己的__new__
来控制对象的创建步骤。对于像 Fraction
这样的不可变类尤其如此。 Fraction.__new__
返回它自己父类(super class)的对象,当发生这种情况时,python 会完全跳过调用 __init__
。对于 Fraction
,它的 __init__
实际上只是 object.__init__
,它只接受单个 self
参数和什么都不做就直接返回。它永远不会被调用。
当您实现 F1.__init__
时,您遇到了一个错误,这个错误掩盖了问题。直接调用父类(super class)方法时,需要在调用中放入self
参数。你应该已经完成了 Fraction.__init__(self, *args, **kwargs)
。如果你这样做了,你会得到与 F2
情况相同的错误(因为 super().__init__(*args, **kwargs)
确实 添加 self
)。
但实际上你有一个更紧迫的问题。可以拥有自己的 __init__
,但有限制。您无法初始化 Fraction
,因为这是在调用 __init__
之前在 __new__
中完成的。而且你不能调用 Fraction.__init__
,它除了在给定参数时爆炸外什么都不做。您可以向对象添加其他属性,仅此而已。但是还会发生其他奇怪的事情。除非您覆盖像 __add__
这样的方法,否则它们将返回原始 Fraction
类型的对象,因为那是被调用的 __new__
。当您的父类使用 __new__
时,您真的想重写那个 __new__
。
关于python - 在 fractions.Fraction 子类中调用 super().__init__(*args, **kwargs) 只接受要初始化的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73169218/
我有一个像 s = "title='bah' name='john and jill' purple='haze' none=None i=1" 我正在寻找一种将其放入字典的 Pythonic 方式(
我正在通过教程阅读有关模板 View 的内容,其中一些代码让我感到困惑。作者使用了这个代码示例 from django.utils.timezone import now class AboutUsV
看不懂下面的例子,假设我有这些功能: # python likes def save(filename, data, **kwargs): fo = openX(filename, "w",
假设我们有一个像这样的函数声明 def myfunc(a=None,b=None): as_dict = {"a": a, "b": b,
def a(**akwargs): def b(bkwargs=akwargs): # how to not only use akwargs defaultly,but al
阅读 Python 文档,有几种创建字典的方法。 dict() dict(**kwargs) dict(mapping, **kwargs) dict(iterable, **kwargs) http
两种方法我都见过,但我不明白它们的区别以及我应该将什么作为“最佳实践”: def custom_function(**kwargs): foo = kwargs.pop('foo')
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我需要将 args 和 kwargs 都存储在一个元组中以便稍后调用,那么在这种情况下元组中的适当值是 *args 还是 args?换句话说,这行得通吗: def __init__(self, *ar
我有这个查询 Location.objects.filter(locations_rate__rate=search_rate).distinct('id') 如何将 distinct() 设置为 *
是否可以简化 kwargs 选项的 bool 检查? 例如在 foo 中我必须检查很多选项: def foo(*args, **kwargs): if 'foo' in kwargs and k
我尝试运行 Python Data Science Essential 一书中的一个示例。但是,当我运行它时出现错误。实际上,我才刚刚开始学习 python。所以,我觉得很难修复这些错误。请帮我。这是
我正在尝试使用以下代码在一个大图中创建多个seaborn regplot: %matplotlib notebook import seaborn as sns from itertools impo
我有一个这样的函数:。如果有参数x,则它一定是布尔值。任何其他命名参数必须为int。。其他人将编写调用foo的函数,我希望他们能够传递x和kwargs。目前,这意味着调用foo()的每个函数除了kwa
当一个类继承自单个类时,调用父方法的首选方式是什么?我知道有两种调用父方法的方法。 选项 1: ParentClass.method(self, *args, **kwargs) 选项 2: supe
问题 我在 Dusty Phillips 的 Object Oriented Programming(为简洁起见而简化)中遇到了这段代码,但我不确定这个定义的特定部分。 class A: de
在创建数据类对象时我可以使用 kwargs 没有问题: @dataclass() class Data: name: str = 'Unnamed' additiona
在创建数据类对象时我可以使用 kwargs 没有问题: @dataclass() class Data: name: str = 'Unnamed' additiona
我在下面运行了一个装饰器演示。 def logger(func): def inner(*args, **kwargs): print(args) print(
如何使用“一个”类参数**kwargs设置对象属性? 我想要的是在一个循环中执行此代码: class purchase(): def __init__(self,**kwargs):
我是一名优秀的程序员,十分优秀!