Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的函数如何知道它正在接收什么类?_Python_Function_Class_Object - Fatal编程技术网

Python 我的函数如何知道它正在接收什么类?

Python 我的函数如何知道它正在接收什么类?,python,function,class,object,Python,Function,Class,Object,我对Python非常陌生,只是在深入了解整个类/对象领域。下面是我真正要解决的问题:如果我在duck.py文件中有一个带有属性和成员函数的类“duck”,而我在witch.py中使用的是一个函数,它接收duck类。我发布进口声明 import duck 然后在我的功能中: def doesitfloat(myduck, mywitch): if myduck.boyancy() == 'floats': ... “doesitfloat”如何知道myduck是具有上述属性/成

我对Python非常陌生,只是在深入了解整个类/对象领域。下面是我真正要解决的问题:如果我在duck.py文件中有一个带有属性和成员函数的类“duck”,而我在witch.py中使用的是一个函数,它接收duck类。我发布进口声明

import duck
然后在我的功能中:

def doesitfloat(myduck, mywitch):
    if myduck.boyancy() == 'floats':
    ...
“doesitfloat”如何知道myduck是具有上述属性/成员函数的duck对象?我想我得到了类的一般概念,但是当我创建一个类时,我如何在其他地方使用它呢

编辑… 我的第一篇文章,也是python的新手——我能说些什么。让我解释一下

在我的类文件duck.py中,我有:

class duck:
    def buoyancy(self):
        return True
在另一个文件witch.py中,我有我的doesitfloat()函数和适当的导入

import duck

def doesitfloat(myduck, mywitch)
    if myduck.buoyancy() == 'floats':
    ...
“doesitfloat”如何知道myduck是一个对象或类型duck?现在,在另一段代码中,甚至在第三个文件中,声明了适当的导入,我有以下内容:

someduck = duck
somewitch = witch  

testingsomething = doesitfloat(someduck, somewitch)

很明显,这个类是在本地声明的,在我的第三个文件中,我声明了someduck和somewitch对象。但是,函数“doesitfloat”从未真正被告知它是duck对象。在其他语言中,“doesitfloat”的声明会显式地声明参数的类型,但是python??抱歉,这让我很困惑。

Python是一种动态类型化语言

在许多语言中,必须使用变量显式声明类型,例如C#:

Duck Duck=newduck();
...
鸭子=新青蛙();//这会在静态类型语言中引发错误
在python中,每个变量都是对python对象的引用。这些对象知道它们自己的类型,并且包含类或基元的属性和方法

duck=duck()
...
duck=Frog()#这会将duck变量改为引用新的Frog对象
如果试图访问不存在的对象的成员,python将抛出错误

您可以使用
isinstance()
函数检查变量是否实际引用了Duck:

def doesitfloat(myduck, mywitch):
    if myduck.boyancy() == 'floats':
    ...
如果存在(duck,duck):
# ... 现在我们知道duck是duck或duck子类

事实上,您刚刚认识到python中的一个指针,它甚至被称为duck programming,因此,如果它像鸭子一样走路和说话,它就是鸭子

程序之前不知道给定对象是否具有所述方法,它尝试访问该对象(如果未找到,则返回错误)

这取决于使用代码的开发人员是否遵守代码的目的


在python中,当您尝试运行
myduck.boyancy()
python尝试访问变量
myduck
引用的对象的
boyancy
属性/方法时,如果未找到任何属性/方法,它将返回错误。

我不确定是否理解该问题。如果你说
myduck=“quack”
那么Python“知道”这是一个字符串。如果您说
myduck=duck()
,那么Python“知道”它是
duck
类的对象。我不明白为什么这两个事实中的任何一个比另一个更神秘。它不“知道”。myduck将具有具有可调用值的boyancy属性,或者将抛出错误。对象携带类型信息。(还有,它的拼写是“浮力”。这里有一个“u”。@RobinZigmond它不知道,因为它不在乎。该语言唯一关心的是
myduck
绑定到某个对象,并将尝试执行您要求它对该对象执行的任何操作;在不查看对象类型的情况下,该尝试要么成功,要么失败。@RobinZigmond我关于Python尝试“不查看对象类型”的说法也不完全正确。当然,它需要类型才能知道在哪里查找属性,但它对该类型没有任何特别的兴趣;它们只是指知道自己类型的任意对象的名称。您没有真正更改变量的类型,因为它从一开始就没有特定的类型。感谢您的澄清,我将改进答案。