可能是地球上最糟糕的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
直接类调用和实例调用之间没有任何区别;但是如果没有某些使用它们,那么它就会反对Zen。所以,如果有差异,那是什么?性能?减少开销?也许可读性?
答案 0 :(得分:2)
没有区别。 instance.method(...)
class.method(instance, ...)
。但这并不违背禅宗,因为它说(强调我的):
应该有一个 - 最好只有一个 - 明显的方式来做。
第二种方式是可能的,每个熟悉Python的人都应该知道(以及为什么),但这是一种非显而易见的方式,没有人在实际代码中做到这一点。
那为什么会那样?这就是方法在任何语言中的工作方式 - 方法是一些在对象/实例上运行的代码(可能还有更多的参数)。除了通常,实例是隐式提供的(例如,在C ++ / Java / D中为this
) - 但由于Zen说“显式优于隐式”,因此self明确地是每个方法的参数,这不可避免地允许这个。明确禁止它将毫无意义。
除此之外,方法不被强制(隐式)接受实例的事实允许定义类方法和静态方法而无需对语言进行特殊处理 - 第一种方法只是一种需要类而不是类的方法一个实例,而后者只是一个根本不期望实例的方法。
答案 1 :(得分: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 :(得分:0)
这可能会让您更好地澄清。
当实例属性是 引用的不是数据 属性,其类被搜索。如果 名称表示有效的类 属性是一个函数对象,a 方法对象是通过打包创建的 (指向)实例对象和 刚找到的函数对象 一起在一个抽象的对象(即这个 方法对象)。当方法 使用参数调用object 列表,一个新的参数列表是 从实例对象构造 和参数列表,以及 用这个函数调用函数对象 新参数列表。