Python认为我传递了3个参数,尽管我只传递了2个

时间:2017-05-12 23:56:10

标签: python class constructor

我已经编写了一个用于处理向量的基本Vector类。计算它们的大小和诸如此类的东西。我有两个重载的构造函数,一个带有两个参数xy,另一个带有一个元组(x,y)

当我初始化变量时,它给出了错误:

  

TypeError:__init__()需要2个位置参数,但是给出了3个。

我错过了什么?

class Vector:

    x = 0.0
    y = 0.0

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __init__(self, coordinates):
        self.x = coordinates[0]
        self.y = coordinates[1]


v1 = Vector(1,3)
print(v1.x)

3 个答案:

答案 0 :(得分:2)

Python不支持重载,因此您使用第二个方法覆盖第一个coordinates方法。第二个只需要一个参数:self。 Python写入3个参数是因为实例(__init__)是隐式传递的。

删除第二个classmethods方法,它将正常工作。

如果您喜欢多个构造函数,您可以将其他构造函数实现为class Vector: x = 0.0 y = 0.0 def __init__(self, x, y): self.x = x self.y = y @classmethod def from_list(cls, coordinates): return cls(coordinates[0], coordinates[1]) # you could also use unpacking: # return cls(*coordinates)

>>> v1 = Vector(1,3)
>>> print(v1.x)
1
>>> v2 = Vector.from_list([2, 1])
>>> print(v2.x)
2

测试:

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>

int costs[95] = {0, 9, 6, 24, 29, 22, 24, 3, 12, 12, 17, 13, 7, 7, 4, 10, 22, 19, 22, 23, 21, 27, 26, 16, 23, 26, 8, 11,
                 10, 14, 10, 15, 32, 24, 29, 20, 26, 26, 20, 25, 25, 18, 18, 21, 16, 28, 25, 26, 23, 31, 28, 25, 16, 23,
                 19, 26, 18, 14, 22, 18, 10, 18, 7, 8, 3, 23, 25, 17, 25, 23, 18, 30, 21, 15, 20, 21, 16, 22, 18, 20,
                 25, 25, 13, 21, 17, 17, 13, 19, 13, 24, 19, 18, 12, 18, 9};

long solve(FILE *input) {
    int c;
    char str[100101];
    int i1 = 0;
    char *string = "";
    char *string1 = "";
    char *string2 = "";
    char *string3 = "";
    str[0] = 'c';
    while (EOF != (c = fgetc(input))) {
        str[i1++] = c;
    }
    int linecost = 0;
    for (int e = 0; e < strlen(str); e++) {
        if (str[e] == '\n') {;
            string1 = malloc(strlen(str) + 1);
            strcpy(string1, str);
            string3 = strtok_r(str, "\n", &string);
            while (string3 != NULL) {
                string2 = malloc(strlen(string3));
                strcpy(string2, string3);
                for (int i = 0; i < strlen(string2); i++) {
                    char strc3[1];
                    strcpy(strc3, &string2[i]);
                    int int1 = strc3[0];;
                    linecost = linecost + costs[int1 - 32];
                }
                printf("%d\n", linecost);
                linecost = 0;
                string3 = strtok_r(NULL, "\n", &string);
                free(string2);
            }
            free(string1);
        }
    }
    return 0;
}

int main(int argc, char **argv) {
    solve(stdin);
    return EXIT_SUCCESS;
}

答案 1 :(得分:0)

Python不会重载构造函数 - 它是一种动态语言,并且没有允许这种情况发生的预知类型。您的代码定义了__init__,然后使用第二个__init__完全替换它。如果你想做这样的事情,你可以用备用签名定义一个工厂方法并调用它。

答案 2 :(得分:0)

您没有重载的构造函数:第二个方法定义会覆盖第一个。因此,幸存的构造函数只需要两个参数。您提供了3 - self 是隐含的。