我已经编写了一个用于处理向量的基本Vector类。计算它们的大小和诸如此类的东西。我有两个重载的构造函数,一个带有两个参数x
和y
,另一个带有一个元组(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)
答案 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 是隐含的。