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

时间:2019-01-31 22:21:27

标签: python function class object

我对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 ... ??抱歉,这只是让我感到困惑。

2 个答案:

答案 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属性/方法,如果找不到任何属性/方法,它将返回错误。