为什么我们在从 Python 中的 class 创建对象时不必定义参数的类型?

Why we don't have to define the type of an argument when creating an object from a class in Python?

我是 Python 的新手,我刚刚创建了一个 class 作为我正在学习的在线课程的一部分。

from math import sqrt

class Line:

def __init__(self,coor1,coor2):
    self.coor1=coor1  #tuple (x1,y1)
    self.coor2=coor2  #tuple (x2,y2)

def distance(self):
    return sqrt((self.coor2[0]-self.coor1[0])**2+(self.coor2[1]-self.coor1[1])**2)

def slope(self):
    return (self.coor2[1]-self.coor1[1])/(self.coor2[0]-self.coor1[0])

这是 Line 的 class,可以帮助我找到两个坐标之间的距离。我想知道,既然一个坐标需要是一个元组,那么 Python 是怎么知道的呢?为什么我不需要在 def __init__?

中定义它

不是python谁知道那是一个元组!如果你想让 python 假定 coor1coor2 是元组,你应该处理它。现在,如果您创建 class 的对象,例如:

line1 = Line("hi","Sorath")

coor1 等于 hicoor2 等于 Sorath 并且它们都是字符串。

coor1coor2 可以是任何东西,你应该在传递值或写 __init__ !

时定义它们的类型
def __init__(self,coor1,coor2):
    if type(coor1)==tuple:
        self.coor1=coor1  #tuple (x1,y1)
    else:
        self.coor1 = () #empty tuple

    if type(coor2)==tuple:
        self.coor2=coor2  #tuple (x2,y2)
    else:
        self.coor2 = () #empty tuple

__init__() 只是 class 的构造函数。创建新对象时会调用此方法。

def __init__(self, coor1, coor2): 表示您希望两个参数(即 coor1 和 coor2)创建对象。例如,当你创建一个对象时,你可以这样做:

coor1 = (2, 6) # a tuple
coor2 = (-4, 12) # a tuple

l = Line(coor1, coor2) # create an object Line

Python is interpreted language and dynamically typed. So the types of variables are inferred by the interpreter.

要知道变量的类型,可以使用函数type(object)。例如

type(coor1)
<class 'tuple'>

下面应该可以很好地解释原因: https://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language

TLDR:开发人员有责任确保您使用的数据类型适合该功能。由于 Python 是动态类型的,因此 "know" 赋值时的数据类型是什么。

Python 3.5+ 虽然引入了变量数据类型的声明(即类型提示):

def __init__(self, coord1: tuple, coord2: tuple):
    # initialize