当前位置: 首页 > 面试题库 >

类和实例方法之间的区别

阙阳
2023-03-14
问题内容

我在阅读PEP
0008(样式指南)时,发现它建议在实例方法中使用self作为第一个参数,而在类方法中使用cls作为第一个参数。

我已经使用并编写了一些类,但从未遇到过类方法(嗯,一种将cls作为参数传递的方法)。有人可以告诉我一些例子吗?

谢谢!


问题答案:

实例方法

创建实例方法时,第一个参数始终为self。您可以随意命名,但含义始终相同,并且self由于其是命名约定,因此应使用。
self(通常)在调用实例方法时隐式传递;它代表调用该方法的实例。

这是一个Inst具有实例方法的类的示例introduce()

class Inst:

    def __init__(self, name):
        self.name = name

    def introduce(self):
        print("Hello, I am %s, and my name is " %(self, self.name))

现在调用此方法,我们首先需要创建我们的类的实例。一旦有了实例,就可以调用introduce()它,该实例将自动以形式传递self

myinst = Inst("Test Instance")
otherinst = Inst("An other instance")
myinst.introduce()
# outputs: Hello, I am <Inst object at x>, and my name is Test Instance
otherinst.introduce()
# outputs: Hello, I am <Inst object at y>, and my name is An other instance

如您所见,我们没有传递参数self,而是使用句点运算符将其隐式传递。我们使用或参数调用Inst类的实例方法。这意味着我们可以调用并获得完全相同的结果。introduce``myinst``otherinst``Inst.introduce(myinst)

类方法

类方法的思想与实例方法非常相似,不同之处在于,我们现在将类本身作为第一个参数传递,而不是隐式地将实例作为第一个参数传递。

class Cls:

    @classmethod
    def introduce(cls):
        print("Hello, I am %s!" %cls)

由于我们仅将类传递给该方法,因此不涉及任何实例。这意味着我们根本不需要实例,我们将类方法称为静态方法:

 Cls.introduce() # same as Cls.introduce(Cls)
 # outputs: Hello, I am <class 'Cls'>

注意,再次Cls被隐式地传递了,所以我们也可以说Cls.introduce(Inst)并获得output "Hello, I am <class 'Inst'>。当我们从中继承类时,这特别有用Cls

class SubCls(Cls):
    pass

SubCls.introduce()
# outputs: Hello, I am <class 'SubCls'>


 类似资料:
  • 问题内容: 我只是在阅读教科书中给我的课文,我不确定自己是否明白我在说什么。这基本上是在告诉我静态方法或类方法包括关键字“修饰符” static。但是我真的不知道那意味着什么吗? 有人可以简单地向我解释什么是静态方法或类方法吗? 另外,我可以简单解释一下什么是Instance方法吗? 这是他们在教科书中给我的: 存在或不存在静态修饰符具有重要的实际意义。一旦Java处理了它所属的类的定义,就可以调

  • 问题内容: 以下变量用法之间的区别是什么 VS 如果我们在一个班级中只有一个“ b”,那么哪个是更好的做法以及为什么。在什么情况下应该使用谁。 问题答案: 这些实际上有非常不同的含义。在情况1中,在构造时分配对象。它只能被构造一次(除非您是在课堂以外的地方重新分配它)。 在情况2中,您将在每次调用该方法时重新分配实例。

  • 问题内容: 用修饰的功能和用修饰的功能有什么区别? 问题答案: 也许有点示例代码将有助于:发现其中的差别在调用签名,并且: 以下是对象实例调用方法的常用方法。对象实例,a作为第一个参数隐式传递。 使用时,对象实例的类作为第一个参数而不是隐式传递。 你也可以使用该类进行呼叫。实际上,如果你将某些东西定义为类方法,则可能是因为你打算从类而不是从类实例调用它。本来会引发,但效果很好: 人们发现类方法的一

  • 问题内容: 我已经在Python的Stack Exchange上阅读了很多答案,为什么在类中使用“ self”? 阅读这些答案后,我了解到实例变量对于该类的每个实例都是唯一的,而在所有实例之间共享类变量。 在玩耍时,我发现这段代码给出了输出: 但是,此代码作为输出,在我看来应为: 为什么我运行时类变量没有更新?我没有编程方面的经验,所以请原谅。 问题答案: 类变量 被 实例属性 遮盖 。这意味着在

  • 本文向大家介绍Ruby类实例变量、类实例方法和类变量、类方法的区别,包括了Ruby类实例变量、类实例方法和类变量、类方法的区别的使用技巧和注意事项,需要的朋友参考一下 在Ruby中类实例变量、类实例方法和类变量、类方法的区别比较微妙,而且用法也有相当的区别。本文探讨一下他们的定义和基本的使用场景,以抛砖引玉...   一.类实例变量和类变量   类变量大家都很熟悉了,就是在类定义中用@@开头的变量

  • 问题内容: 类方法和实例方法有什么区别? 实例方法是访问器(getter和setter)而类方法是其他所有东西吗? 问题答案: 就像大多数其他答案所说的那样,实例方法使用类的实例,而类方法只能与类名一起使用。因此在Objective-C中对它们进行了定义: 然后可以像这样使用它们: 一些真实世界的类方法的例子是很多基础类,如方便的方法的或的。实例方法将是的方法。