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

时间:2019-02-13 22:34:25

标签: python python-3.x oop

我对Python很陌生,正在解决OOP。对于何时使用对方法和类的调用,我有些困惑。下面的示例代码输出平均值,但是从现实世界的角度来看,我好奇何时使用Class vs方法进行调用。我很确定这只是我可能尚未解决的问题,但是关于何时使用一个在另一个上这只是一个困惑。

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))

1 个答案:

答案 0 :(得分:4)

在您的示例中,没有区别。 使用第一种方法。。第二种方法使您似乎出于某种原因需要使用“后门”,例如,如果Array ( [0] => 1 [1] => 10 [2] => 10-Einzel.pdf ) 但您想专门呼叫{{ type(student_one) is not Student类的1}}方法。

对于幕后发生的事情,第一种方法使用bound method,第二种方法使用普通的function

average

绑定方法只是通过descriptor protocol *绑定到实例的函数,实例(“ self”)作为隐式第一个位置参数传递:

Student

通过使用类上的函数并显式传递实例,您实际上执行的操作与自动执行描述符的操作相同。

要更深入地了解什么是方法,请参见文档here中有关此绑定过程的详细文档。

* 只是通过“”的一种奇特的说法。即点分属性访问