Sno*_*ter 0 python class difference
我在编码方面还是个初学者,已经编写了一些简单的游戏,但现在我已经开始学习课程了。我不确定两者之间有什么区别
user.walk()
Run Code Online (Sandbox Code Playgroud)
和
Person.walk(user)
Run Code Online (Sandbox Code Playgroud)
这是类定义:
class Person():
def __init__(self, age, weight, height, first_name, last_name):
self.age = age
self.weight = weight
self.height = height
self.first_name = first_name
self.last_name = last_name
def walk(self):
print('Walking')
Run Code Online (Sandbox Code Playgroud)
这里我定义谁是用户:
user = Person(13, 50, 170, 'First name', 'Last name')
Run Code Online (Sandbox Code Playgroud)
因此,如果有人有时间回答这个问题,请帮助我理解这一点。
基本上没有区别。user.walk()最终会有效地翻译成,Person.walk(user)但对于普通程序员来说更易读,更不用说惯用语了。
具体来说,如果发生这种情况会发生什么。Person.walk(user)只是对普通函数的普通函数调用。这里没有魔法。但是当Python看到
user.walk()
Run Code Online (Sandbox Code Playgroud)
walk并且对象上没有user(因为它没有定义为对象本身的实例变量),那么Python将查找该类。具体来说,它将转换user.walk()为
type(user).walk.__get__(user, type(user))()
Run Code Online (Sandbox Code Playgroud)
Python 中的函数对象有一个__get__方法可以将它们转换为绑定方法对象,所以这实际上变成了
(lambda: Person.walk(user))()
Run Code Online (Sandbox Code Playgroud)
也就是说,通过eta 转换,
Person.walk(user)
Run Code Online (Sandbox Code Playgroud)
Python 在幕后完成所有这些工作,因此除非您正在进行一些高级元编程,否则您不必担心它。