Python中类调用与方法调用有何区别?

3 投票
3 回答
1565 浏览
提问于 2025-04-16 02:55

我可能是地球上最糟糕的面向对象编程(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

看起来直接调用类和实例调用之间没有什么区别;但是,按照编程的原则,包含这样的特性应该是有一些用处的。那么,如果真有区别,那是什么呢?是性能?减少开销?还是可读性?

3 个回答

0

这段话可能会让你更清楚一些。

当你想用一个实例属性,但这个属性不是数据属性时,系统会去查找它的类。如果这个名字对应的确实是一个有效的类属性,并且它是一个函数对象,那么系统就会创建一个方法对象。这个方法对象是通过把实例对象和刚找到的函数对象一起打包成一个抽象对象来实现的(也就是这个方法对象)。当你用一组参数调用这个方法对象时,系统会根据实例对象和这组参数重新构建一个新的参数列表,然后用这个新的参数列表去调用函数对象。

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)

这里有一些更多的帮助,供你阅读。

2

其实这两种写法没有区别。instance.method(...) 就是 class.method(instance, ...)。这并不违反编程的原则,因为原则上说(我强调一下):

应该有一种——最好只有一种——明显的方法来做这件事。

第二种写法是可以的,懂Python的人都应该知道(以及知道为什么),但这并不是一种明显的方法,实际上没人会在代码中这样写。

那么为什么会这样呢?这就是方法在任何语言中的工作方式——方法是一些对对象/实例进行操作的代码(可能还有其他参数)。通常情况下,实例是隐式提供的(比如在C++/Java/D中用到的this),但因为原则上说“显式比隐式好”,所以在Python中,self是每个方法的显式参数,这就让这种写法成为可能。显式地禁止这种写法是没有意义的。

除此之外,方法不强制(隐式)接受实例的事实,让类方法和静态方法可以在不需要语言特别处理的情况下定义——类方法只是一个期望接收类而不是实例的方法,而静态方法则是一个根本不期望接收实例的方法。

撰写回答