呼叫object.method()和class.Method(对象)时,场景后面发生了什么



我对Python和Am Angue OOP非常陌生。对于何时使用对方法和类的电话,我有些困惑。下面的示例代码输出了平均值,但是我很好奇您何时从现实世界的角度使用类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))

在您的示例中,没有区别。使用第一种方式。第二种方法使它看起来好像您需要使用"后门"。由于某些原因,例如,如果student_one实际上不是Student实例,但您想专门调用Student类的average方法。

如果经验丰富的Python开发人员要读取您的代码,则看到Student.average(student_one)可能会使它们停下来暂停,并想知道为什么作者想在此处使用Unbound average。这将是一种不寻常的风格,也许可能意味着可能发生的事情比实际发生的事情更为微妙 - 绊脚石。

对于幕后发生的事情,第一种方法使用 bound方法,第二种方法只使用正常函数。

>>> Student.average
<function __main__.Student.average(self)>
>>> student_one.average 
<bound method Student.average of <__main__.Student object at 0xcafef00d>>

绑定的方法只是通过描述符协议*绑定到实例的函数,而实例(" self quot")被隐含地传递为第一个位置参数:

>>> student_one.average.__self__ is student_one 
True
>>> student_one.average.__func__ is Student.average 
True

通过在类上使用该函数并在实例中明确传递,您本质上可以做与描述符的调用相同的事情。

为了更深入地了解方法是什么,此处的文档中有此绑定过程的详细文档。

*只是通过"。"的一种奇特的说法。即虚线属性访问

相关内容

最新更新