>类、方法和实例让我彻底困惑。为什么会这样:
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()
你实际在做的是调用config
,com1
作为它的参数。所以com1.config(()
和Computer.config(com1)
一样.
为什么第二种方法不起作用?
因为Computer
是称为元类的实例。它在某种程度上是类定义,实际上不是Computer
的实例。com1
是由Computer
创建的实例。您可以使用com1
调用其非静态函数,但不能使用元类Computer
调用非静态函数,这些函数需要运行对象。
为什么第三种方法有效?
您是否注意到config
函数定义中的self
?这意味着当你调用com1.config()
时,你实际正在做的事情是以com1
作为参数调用config
。所以com1.config()
和Computer.config(com1)
一样。