Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调用object.method()和Class.method(object)时,幕后发生了什么?_Python_Python 3.x_Oop - Fatal编程技术网

Python 调用object.method()和Class.method(object)时,幕后发生了什么?

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

我是Python新手,正在处理OOP。对于何时使用对方法和类的调用,我有点困惑。下面的示例代码输出的是平均值,但我很好奇,从现实世界的角度来看,何时使用类调用与方法调用。我很确定这只是我可能还没有解决的问题,但我只是有点困惑,什么时候我会使用一个而不是另一个

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,第二种方法只使用普通的

通过在类上使用函数并显式传递实例,基本上可以完成与描述符调用自动完成的相同操作

为了更深入地理解方法是什么,文档中有关于这个绑定过程的详细文档


*这只是一种通过“.”即虚线属性访问的奇特方式,在您的示例中,没有区别使用第一种方法。第二种方法使其看起来好像出于某种原因需要使用“后门”,例如,如果
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()
它们在功能上是等价的。严格来说,
object.method()
正在调用
object
中的绑定方法。
class
调用使用未绑定的方法,但显式传递对象。如果您正在操作实例状态,请始终使用,
object.method()
。。。为或函数保留
class.method()
。您将始终使用
student\u one.average()
对“后门”的解释非常有用。因此,似乎只有在有任何实例需要我访问average方法时,我才想从类中调用(可能对那些不是学生的人进行类似的计算)。object.method()就是这样@AntonioSaqueton是的,你明白了,“后门”的解释很有帮助。因此,似乎只有在有任何实例需要我访问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