首页 > 解决方案 > 在 Python 中使用类定义调用实例方法

问题描述

最近,我一直在研究 Python 的类实例化过程,以真正了解在创建类实例时会发生什么。但是,在玩弄测试代码时,我遇到了一些我不明白的东西。

考虑这个虚拟类

class Foo():

    def test(self):
        print("I'm using test()")

通常,如果我想使用Foo.test instance method,我会去创建一个实例Foo并像这样显式调用它,

foo_inst = Foo()
foo_inst.test()
>>>> I'm using test()

但是,我发现以这种方式调用它最终会得到相同的结果,

Foo.test(Foo)
>>>> I'm using test()

在这里,我实际上并没有创建实例,但我仍在访问Foo的实例方法。为什么以及如何在 Python 的上下文中工作?我的意思是self通常指的是类的当前实例,但在这种情况下,从技术上讲,我并不是在创建类实例。

print(Foo()) #This is a Foo object
>>>><__main__.Foo object at ...>
print(Foo) #This is not
>>>> <class '__main__.Foo'>

标签: pythonclassinstance-methods

解决方案


向在评论部分引导我到那里的每个人的道具。


这个问题的答案依赖于 Python 的两个基础知识:

  1. 鸭子打字
  2. 一切都是对象

事实上,即使selfPython 习惯于引用当前类实例,由于 Python 处理类型的方式,您在技术上可以传递您想要的任何对象。

现在,另一个让我感到困惑的是,我没有在第二个示例中创建对象。但是,问题是,Foo在内部已经是一个对象。

这可以像这样进行经验测试,

print(type(Foo))
<class 'type'>

所以,我们现在知道这Foo是一个类的实例,因此即使它不是自身的实例type也可以传递。self

基本上,如果我要像我的方法中的对象self一样操作它,那么在像我的第二个示例一样调用它时会遇到问题。Footest


推荐阅读