当前位置:  开发笔记 > 编程语言 > 正文

在继承自int或float或str的类中设置参数的值

如何解决《在继承自int或float或str的类中设置参数的值》经验,为你挑选了0个好方法。

当我尝试设置继承自的类的参数的值时,会引发错误str.只有当我尝试访问参数时才会发生错误myClass(arg = 'test').错误是:

TypeError: 'arg' is an invalid keyword argument for this function

问题显示在此示例中:

class A(str):    
    def __init__(self, arg):
        pass

A("test") # Works well
A(arg = "test") # Fails

只有最后一行才会引发错误.前一行效果很好.问题与从int或继承的类相同float.

更新(解决方案):

我找到了这些链接的解决方案:

将可选参数添加到内置类型的乘法继承子类的构造函数中?

从str或int继承

解决方案是:

class A(str):

    def __new__(cls, *args, **kwargs):
        return str.__new__(cls)

    def __init__(self, arg01):
        print(arg01)

A(arg01= "test")

我不确切知道为什么会有效,我会对此进行调查.如果有人有明确的解释,我很感兴趣,我提前感谢他.

更新(我的解释):

我不确定我会说什么,但这就是我所理解的.

想象一下'myClass'没有任何遗产的课程.当我这样做时myInstance = myClass(),会发生以下情况:

该方法myClass.__new__被执行.此方法将创建对象myInstance.__new__是真正的构造函数(__init__不是构造函数!).在伪代码中,__new__看起来像这样:

def __new__ (cls, *args, **kwargs):

    myInstance = # Do some stuff to create myInstance, an object of the type passed as argument (cls).
    # Add the method __init__ to myInstance.
    # Call __init__ and pass to it the list 'args' and the dictionary 'kwargs' (both come from arguments of __new__). Pass to it also the object itself (self) : 
    obj.__init__(self, args, kwargs) :
        # Do some stuff.

当我们使用不可变类型(str,int,float,tuple)时,情况会有所不同.在之前的伪代码中,我写道def __new__(cls, *args, **kwargs).对于不可变类型,该方法的伪代码__new__更像是这样def __new__(cls, anUniqueValue).我并不真正理解为什么这种行为不同于immutableTypes.__new__其他行为,但事实并非如此.你可以在这个例子中看到它:

class foo():

    def __init__(self):
        pass

foo.__new__(foo, arg = 1)
# That works because the method __new__ look like this : def __new__(*args, **kargs).

str.__new__(str, arg = 1)
# That fails because we are trying to pass the attribute 'arg' to a method which look like this : def __new__(anUniqueValue).

从那里,我们可以理解为什么之前提出的解决方案有效.我们所做的是编辑__new__不可变类型的方法,就像一个可变类型一样工作.

def __new__(cls, *args, **kwargs):
    return str.__new__(cls)

这2行转换 def __new__ (cls, anUniqueValue)def __new__ (cls, *args, **kwargs)

我希望我的解释几乎清楚,没有太多错误.如果你说法语,你可以学到更多的链接:http://sametmax.com/la-difference-entre- -et- 初始化烯蟒蛇/

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有