我对Python还是很陌生,只是真的在深入了解整个类/对象领域。这就是我真正要苦苦挣扎的事情:如果我在文件duck.py中有一个带有属性和成员函数的类“ duck”,并且我在witch.py中使用了一个接受鸭子类的函数。我发出了import语句
import duck
然后在我的函数中
def doesitfloat(myduck, mywitch):
if myduck.boyancy() == 'floats':
...
“ doesitfloat”如何知道myduck是具有上述属性/成员函数的鸭子对象?我认为我已经掌握了类的一般概念,但是当我创建类时,如何在其他地方使用它?
编辑... 我的第一篇文章也是python的新手-我能说什么。我来说明一下。
在我的班级文件duck.py中,我拥有:
class duck:
def buoyancy(self):
return True
在另一个文件witch.py中,我具有正确导入的dositfloat()函数
import duck
def doesitfloat(myduck, mywitch)
if myduck.buoyancy() == 'floats':
...
“ doesitfloat”如何知道myduck是对象或键入duck?现在,在另一段代码中-甚至在第三个文件中,都声明了适当的导入,我有以下内容:
someduck = duck
somewitch = witch
testingsomething = doesitfloat(someduck, somewitch)
很明显,该类已声明,并且在我的第三个文件中本地声明了someduck和somewitch对象。但是,从未真正告诉函数“ doesitfloat”是鸭子对象。在其他语言中,“ doesitfloat”的声明将明确声明参数的类型,但是python ... ??抱歉,这只是让我感到困惑。
答案 0 :(得分:1)
Python是一种动态类型的语言。
在许多语言中,您必须使用变量明确声明类型,例如在C#中:
Duck duck = new Duck();
...
duck = new Frog(); // This throws an error in a statically typed language
在python中,每个变量都是对python对象的引用。这些对象知道它们自己的类型,并包含其构造类或基元的属性和方法。
duck = Duck()
...
duck = Frog() # This changes the duck variable to reference a new Frog object instead
如果您尝试访问不存在的对象的成员,python将抛出错误。
您可以使用isinstance()
函数检查变量是否实际引用了Duck:
if isinstance(duck, Duck):
# ... now we know duck is a Duck or Duck sub-class
答案 1 :(得分:0)
实际上,您刚刚意识到python中的一个指针,它甚至被称为鸭子编程,因此可以说如果它像鸭子一样走路和说话,那就是鸭子
该程序较早不知道给定对象是否具有上述方法,它将尝试访问该方法(如果找不到则返回错误)。
由开发人员使用代码来遵守代码的目的。
在python中,当您尝试运行myduck.boyancy()
时,python会尝试访问变量boyancy
所引用对象的myduck
属性/方法,如果找不到任何属性/方法,它将返回错误。