Python 我的函数如何知道它正在接收什么类?
我对Python非常陌生,只是在深入了解整个类/对象领域。下面是我真正要解决的问题:如果我在duck.py文件中有一个带有属性和成员函数的类“duck”,而我在witch.py中使用的是一个函数,它接收duck类。我发布进口声明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是具有上述属性/成
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尝试“不查看对象类型”的说法也不完全正确。当然,它需要类型才能知道在哪里查找属性,但它对该类型没有任何特别的兴趣;它们只是指知道自己类型的任意对象的名称。您没有真正更改变量的类型,因为它从一开始就没有特定的类型。感谢您的澄清,我将改进答案。