最近,我一直在研究Python的类实例化过程,以便真正理解创建类实例时幕后发生的事情。但是,在尝试测试代码时,我遇到了一些我不理解的事情。
考虑一下这个虚拟类
class Foo():
def test(self):
print("I'm using test()")
通常,如果我想使用Foo.test
实例方法,我会创建一个Foo
实例,并像这样显式调用它,
foo_inst = Foo()
foo_inst.test()
>>>> I'm using test()
但是,我发现这样做的结果是一样的,
Foo.test(Foo)
>>>> I'm using test()
这里我实际上并没有创建一个实例,但是我仍然在访问Foo
的instance方法。为什么以及如何在self
的上下文中工作呢?我的意思是,Python通常指的是类的当前实例,但在这种情况下,从技术上讲,我不是在创建一个类实例。
print(Foo()) #This is a Foo object
>>>><__main__.Foo object at ...>
print(Foo) #This is not
>>>> <class '__main__.Foo'>
发布于 2018-07-25 20:57:23
关于你的问题(和答案)的一些笔记。首先,所有的东西都是一个对象。甚至一个类也是一个对象,所以有一个类的类(称为元类),在本例中是type
。
第二,与你的案例更相关。方法或多或少是类属性,而不是实例属性。在python中,当您有一个对象obj
,即Class
的实例,并且您访问obj.x
时,python首先查找obj
,然后查找Class
。这就是从实例访问方法时发生的情况,它们只是特殊的类属性,因此可以从实例和类访问它们。而且,因为您没有使用应该传递给test(self)
函数的self
的任何实例属性,所以传递的对象是不相关的。
为了深入理解这一点,如果你不熟悉描述符协议,你应该阅读它。它解释了很多关于python中的事情是如何工作的。它允许python类和对象本质上是字典,具有一些特殊的属性(非常类似于javascript对象和方法)。
有关类的实例化,请参阅关于__new__
和元类。
https://stackoverflow.com/questions/51505666
复制相似问题