【问题标题】:What is the difference in Python between a class call and a method call?Python中的类调用和方法调用有什么区别?
【发布时间】:2011-03-31 00:17:01
【问题描述】:

作为地球上最糟糕的 OOP 程序员之一,我一直在阅读大量示例代码以帮助“了解”类可以用于什么。最近我发现了这个例子:

class NextClass:                            # define class
    def printer(self, text):                # define method
        self.message = text                 # change instance
        print self.message                  # access instance

x = NextClass()                             # make instance

x.printer('instance call')              # call its method

print x.message                               # instance changed

NextClass.printer(x, 'class call')      # direct class call

print x.message                               # instance changed again

直接类调用和实例调用之间似乎没有任何区别;但是在没有 some 使用的情况下包含类似的功能是违反 Zen 的。那么,如果有区别,那是什么?表现?减少开销?也许可读性?

【问题讨论】:

    标签: python class methods call instance


    【解决方案1】:

    在这种情况下,没有区别。在这两个调用中,您都提供了该类的一个实例:

    x.printer('instance call')  # you supplied x and then called its printer method
    NextClass.printer(x, 'class call')  # you supplied x as a parameter this time
    

    不过,通常情况下,我不会经常编写第二种方法。我通常认为对实例进行操作的任何方法都是实例方法。比如:

    car.drive('place')
    car.refuel
    car.impound
    

    而且,我使用类方法来进行更普遍的操作(我很难描述这一点):

    Car.numberintheworld # returns the number of cars in the world (or your program)
    

    Here's 一些more help,供您阅读。

    【讨论】:

      【解决方案2】:

      这可能会给你一个更好的说明。

      当一个实例属性是 引用的不是数据 属性,则搜索其类。如果 该名称表示一个有效的类 属性是一个函数对象,一个 方法对象是通过打包创建的 (指向)实例对象和 刚刚找到的函数对象 一起在一个抽象对象中(即这个 方法对象)。当方法 使用参数调用对象 列表,一个新的参数列表是 从实例对象构造 和参数列表,以及 用 this 调用函数对象 新参数列表。

      【讨论】:

        【解决方案3】:

        没有区别。 instance.method(...) class.method(instance, ...)。但这并不违背禅宗,因为它说(强调我的):

        应该有一种——最好只有一种——明显的方法。

        第二种方式是可能的,每个对 Python 有很好了解的人都应该知道(以及为什么),但这是一种不明显的方式,没有人在实际代码中这样做。

        那为什么会这样呢?这就是方法在任何语言中的工作方式——方法是对对象/实例(可能还有更多参数)进行操作的一些代码。除了通常情况下,实例是隐式提供的(例如 C++/Java/D 中的this) - 但由于 Zen 说“显式优于隐式”,因此 self 显式地是每个方法的参数,这不可避免地允许这样做。明确禁止它是没有意义的。

        除此之外,方法不强制(隐式)获取实例的事实允许在没有特殊处理语言的情况下定义类方法和静态方法 - 第一个只是一个期望类而不是类的方法一个实例,而后者只是一个根本不期望实例的方法。

        【讨论】:

        • 令人难以置信的解释 delnan,你似乎总能帮我解决这些问题!
        • (A == 比较也表明你的正确性。)
        猜你喜欢
        • 1970-01-01
        • 2014-04-15
        • 1970-01-01
        • 2013-09-01
        • 2020-02-19
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        相关资源
        最近更新 更多