我对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
通过在类上使用该函数并在实例中明确传递,您本质上可以做与描述符的调用相同的事情。
为了更深入地了解方法是什么,此处的文档中有此绑定过程的详细文档。
*只是通过"。"的一种奇特的说法。即虚线属性访问