当涉及到 Python 中的类、方法和实例时,括号究竟是如何工作的?



>类、方法和实例让我彻底困惑。为什么会这样:

class Computer:

def config(self):
print('i5, 16gb, 1TB')
com1 = Computer()
com1.config()

但这不行?

class Computer:

def config(self):
print('i5, 16gb, 1TB')
com1 = Computer()
Computer.config()

但是,如果您修改上面的代码以在调用方法时将实例作为参数包含在内,如下所示:

Computer.config(com1)

它有效吗?我看到了两者之间的区别,但我不明白。

在您的示例中,Computer.config是一个实例方法,表示它绑定到一个对象,或者换句话说需要一个对象。因此,在第二个示例中,您将编写:

com1.config()

您也可以按以下样式编写它:

Computer.config(com1)

这是相同的,只是句法糖。在相同的特殊情况下,您可能更喜欢后一种,例如,当需要鸭子打字时,但第一种绝对是首选方式。

此外,还有不需要任何对象的静态方法或类方法函数。一个例子是这样的:

class Computer
@staticmethod
def config():
print("Foo")
Computer.config()  # no object required at all, because its a staticmethod

请注意缺少self参考。从技术上讲,静态方法Computer.config只是一个简单的函数,但它有助于对功能进行分组,使它们成为类成员。

这是因为config()是一个实例方法,而不是静态方法。简单地说,实例方法在类的所有对象之间共享,并且不能仅使用类名进行访问。如果要仅使用类名调用config(),则必须告诉编译器它是静态的。为此,请使用@staticmethod标记,并删除self参数:

class Computer:
@staticmethod
def config():
print('i5, 16gb, 1TB')
com1 = Computer()
com1.config()

正如你所说:

如果直接修改上面的代码以将实例作为 调用方法时的参数,如下所示:

这是因为,每个实例函数都self作为第一个参数。基本上self有点类似于C++或Java中的this,它告诉要处理哪个对象,即self充当指向当前对象的指针。当您将com1对象传递给参数时,它花了 self 作为com1.

这意味着,当你调用com1.config()你实际在做的是调用configcom1作为它的参数。所以com1.config(()Computer.config(com1)一样.

为什么第二种方法不起作用?

因为Computer是称为元类的实例。它在某种程度上是类定义,实际上不是Computer的实例。com1是由Computer创建的实例。您可以使用com1调用其非静态函数,但不能使用元类Computer调用非静态函数,这些函数需要运行对象。

为什么第三种方法有效?

您是否注意到config函数定义中的self?这意味着当你调用com1.config()时,你实际正在做的事情是以com1作为参数调用config。所以com1.config()Computer.config(com1)一样。

最新更新