首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中使用类定义调用实例方法

在Python中使用类定义调用实例方法
EN

Stack Overflow用户
提问于 2018-07-25 02:52:13
回答 1查看 795关注 0票数 2

最近,我一直在研究Python的类实例化过程,以便真正理解创建类实例时幕后发生的事情。但是,在尝试测试代码时,我遇到了一些我不理解的事情。

考虑一下这个虚拟类

代码语言:javascript
复制
class Foo():

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

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

代码语言:javascript
复制
foo_inst = Foo()
foo_inst.test()
>>>> I'm using test()

但是,我发现这样做的结果是一样的,

代码语言:javascript
复制
Foo.test(Foo)
>>>> I'm using test()

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

代码语言:javascript
复制
print(Foo()) #This is a Foo object
>>>><__main__.Foo object at ...>
print(Foo) #This is not
>>>> <class '__main__.Foo'>
EN

回答 1

Stack Overflow用户

发布于 2018-07-25 20:57:23

关于你的问题(和答案)的一些笔记。首先,所有的东西都是一个对象。甚至一个类也是一个对象,所以有一个类的类(称为元类),在本例中是type

第二,与你的案例更相关。方法或多或少是类属性,而不是实例属性。在python中,当您有一个对象obj,即Class的实例,并且您访问obj.x时,python首先查找obj,然后查找Class。这就是从实例访问方法时发生的情况,它们只是特殊的类属性,因此可以从实例和类访问它们。而且,因为您没有使用应该传递给test(self)函数的self的任何实例属性,所以传递的对象是不相关的。

为了深入理解这一点,如果你不熟悉描述符协议,你应该阅读它。它解释了很多关于python中的事情是如何工作的。它允许python类和对象本质上是字典,具有一些特殊的属性(非常类似于javascript对象和方法)。

有关类的实例化,请参阅关于__new__和元类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51505666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档