Python 调用object.method()和Class.method(object)时,幕后发生了什么?
我是Python新手,正在处理OOP。对于何时使用对方法和类的调用,我有点困惑。下面的示例代码输出的是平均值,但我很好奇,从现实世界的角度来看,何时使用类调用与方法调用。我很确定这只是我可能还没有解决的问题,但我只是有点困惑,什么时候我会使用一个而不是另一个Python 调用object.method()和Class.method(object)时,幕后发生了什么?,python,python-3.x,oop,Python,Python 3.x,Oop,我是Python新手,正在处理OOP。对于何时使用对方法和类的调用,我有点困惑。下面的示例代码输出的是平均值,但我很好奇,从现实世界的角度来看,何时使用类调用与方法调用。我很确定这只是我可能还没有解决的问题,但我只是有点困惑,什么时候我会使用一个而不是另一个 class Student: def __init__(self, new_name, new_grades): self.name = new_name self.grades = new_grad
class Student:
def __init__(self, new_name, new_grades):
self.name = new_name
self.grades = new_grades
def average(self):
return sum(self.grades) / len(self.grades)
student_one = Student('Test User', [70, 88, 90, 99])
# object.method()
print(student_one.average())
# Class.method(object)
print(Student.average(student_one))
在你的例子中,没有区别使用第一种方法。第二种方法使其看起来好像出于某种原因需要使用“后门”,例如,如果
student\u one
实际上不是student
实例,但您想特别调用student
类的average
方法
如果有经验的Python开发人员阅读您的代码,看到Student.average(Student\u one)
可能会让他们暂停片刻,想知道作者为什么要在这里使用未绑定的average
。这将是一种不寻常的风格,可能意味着可能会有比实际情况更微妙的事情发生——一个绊脚石
对于幕后发生的事情,第一种方法使用a,第二种方法只使用普通的
通过在类上使用函数并显式传递实例,基本上可以完成与描述符调用自动完成的相同操作
为了更深入地理解方法是什么,文档中有关于这个绑定过程的详细文档
*这只是一种通过“.”即虚线属性访问的奇特方式,它们在功能上是等价的。严格来说,
object.method()
正在调用object
中的绑定方法。class
调用使用未绑定的方法,但显式传递对象。如果您正在操作实例状态,请始终使用,object.method()
。。。为或函数保留class.method()
。您将始终使用student\u one.average()
对“后门”的解释非常有用。因此,似乎只有在有任何实例需要我访问average方法时,我才想从类中调用(可能对那些不是学生的人进行类似的计算)。object.method()就是这样@安东尼奥萨奎顿是的,你明白了。
>>> Student.average
<function __main__.Student.average(self)>
>>> student_one.average
<bound method Student.average of <__main__.Student object at 0xcafef00d>>
>>> student_one.average.__self__ is student_one
True
>>> student_one.average.__func__ is Student.average
True