【问题标题】:Why we don't have to define the type of an argument when creating an object from a class in Python?为什么我们在 Python 中从类创建对象时不必定义参数的类型?
【发布时间】:2019-10-12 12:40:01
【问题描述】:

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

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 的一个类,可以帮助我找到两个坐标之间的距离。我想知道,既然坐标需要是一个元组,那么 Python 是如何知道这一点的?为什么我不需要在def __init__ 中定义它?

【问题讨论】:

  • 另一个角度:为什么 python 需要知道你的参数必须是元组?
  • Python 不在乎你是否使用元组或其他东西——即。字符串或整数。您可以使用 if isinstance(coor1, tuple): 仅使用元组,但您仍然可以使用 3 个或更多数字或字符串 - Line( ("Hello", "World"), ("Anonther", "tuple", "with", "strings") ) 放置元组,为此您必须使用更多 if

标签: python class object dynamic-typing


【解决方案1】:

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

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 中的类型呢?
  • @Sorath 你不会在 Python 中打扰它由你来跟踪你的类型 Python 字面上不关心
  • @Sorath,有关如何声明变量类型的示例,请参阅我的答案。只需确保您使用的是 Python 3.6
  • @Sorath 使用type(coor1)==tuple,再次查看我的答案
【解决方案2】:

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

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 是解释型语言并且是动态类型的。所以变量的类型是由解释器推断出来的。

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

type(coor1)
<class 'tuple'>

【讨论】:

    【解决方案3】:

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

    TLDR:开发人员有责任确保您使用的数据类型适合该功能。由于 Python 是动态类型的,它会在赋值时“知道”数据类型。

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

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

    【讨论】:

    • 这不会强制 corrd1 成为 tuple
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多