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

允许一个子类有不同的args和kwargs从它的父类在python

有骏祥
2023-03-14

下面的代码是一个基本的Angle对象的初始化方法,它的父类是浮动。

class Angle(float):
    def __init__(self, value, vertex2 = None, vertex3 = None, atype = 'convex'):

        #type-checking for the input args
        try:
            #checks for value arg
            angle = value
            if not (0 < value < 360):
                angle %= 360
        except TypeError:
            #checks for three-vertice args
            try:
                angle = three_point_angle(value, vertex2, vertex3)
                #three_point_angle is a function to calculate the
                #convex angle between three vertices (i.e. at vertex2)
                if atype == 'concave':
                    angle = 360 - angle
                self._vdict = {}
                for pos, vert in enumerate([value, vertex2, vertex3]):
                    self._vdict[pos] = vert
            except:
                raise TypeError(\
                    "You may only specify either an angle value, or three vertices from which \
                    to calculate the angle. You input a %s, %s and %s value." % (\
                        type(value), type(vertex2), type(vertex3)))
        self.angle = angle

此类背后的思想是,您可以输入角度值,或者指定三个顶点(以及可选的角度类型参数)以自动计算角度。最后,自我。角度总是初始化的,这是进行所有运算的地方(因此\uuuu add\uuuu(self,other)会影响self。角度)。

它从float继承的原因是继承了反射和增强赋值的神奇方法,这些方法都是在self上执行的。角度

当试图为顶点输入三个值时,就会出现问题。由于它继承自float,因此不能接受多个参数,因此会引发错误。我该如何解决这个问题?我的猜测是,我必须为Angle创建一个\uuuuuuu新的 方法,这样它将被调用,而不是超类',但我甚至不知道从哪里开始,或者这是否是正确/最好的方法。


共有2个答案

应和悦
2023-03-14

见这一相关问题:

如何在Python中为自定义类重载'float()'?

然后改变

class Angle(float):

class Angle(object):
羊冠玉
2023-03-14

您不需要从float继承。你认为神奇的方法是在自己身上实施的,这是错误的。角他们只是自我表演。请尝试以下代码:

class Angle(float):
    def __init__(self, x):
         self.angle = x
    def double(self):
         self.angle *= 2
a = Angle(1)
a.double()
print a # prints 1.0
print a.angle # prints 2
a *= 5
print a # prints 5.0
print a.angle # throws AttributeError

a.angle不受魔法方法的影响,float(a)也不受a.angle上的操作的影响floats是不可变的,因此a*=5创建了一个具有不同属性的新float。

因此,如果将角度更改为继承自对象而不是浮动,则可以控制初始化,而不会失去任何便利。

 类似资料:
  • 问题内容: 我正在尝试使用具有抽象基类的Python类型注释来编写一些接口。有没有一种方法来注释可能的类型和? 例如,如何表达一个函数的明智参数是一个或两个?给出,所以我的猜测是将类型注释为,但这是行不通的。 来自mypy的错误消息: Mypy不喜欢此函数调用是有道理的,因为它希望调用本身中包含a。解压后的附加内容还会产生我不理解的输入错误。 一个人如何诠释明智的类型和? 问题答案: 对于可变位置

  • 我正在用抽象基类尝试Python的类型注释来编写一些接口。有没有办法注释和的可能类型? 例如,如何表示函数的合理参数是一个或两个s给出了,所以我猜应该将该类型注释为,但这不起作用。 来自mypy的错误消息: mypy不喜欢函数调用这样是有道理的,因为它期望调用本身中有一个。开箱后的添加也给出了一个我看不懂的打字错误。 如何注释和的合理类型?

  • 问题内容: 为了理解 args和* kwargs,当我遇到这个问题时,我进行了一些搜索* args和** kwargs? 所选答案下方的答案引起了我的注意,这是: 我在此示例上尝试了一些操作,并以这种方式运行代码: 我懂了: 变像 结果是: 出于某些头脑混乱的原因,我对此提出质疑:上面的示例中是对还是错?现实生活中将允许做什么,而在现实生活中不允许做什么? 问题答案: 你不会 不 支持任意关键字参

  • 我正在尝试创建一个名为的类,其函数允许传入另一个对象,该对象可能是类型。但是当我尝试键入允许该类型对象的提示时,Python会抛出错误,因为尚未定义。这是代码,当我取出类型提示时有效: 我得到的错误是: 我有什么方法可以实现这一点吗?还是这是不可能的,我不应该费心?

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

  • 这是我的场景,我有三节课。 这里translate方法返回动物对象,但我需要使用相同的方法返回狗和猫类型,而不需要进行类型转换。我知道我必须在这里使用泛型,但是我如何编辑translate方法来支持泛型,这样我就可以将类类型传递给它的参数,如果使用Cat参数调用它就返回Cat对象,如果使用动物参数调用它就返回动物对象,如果使用Dog参数调用它就返回Dog对象。 例如:-而不是 Cat newCat