Python类方法中self开头的属性与方法参数的使用区别是什么
Python类方法中实例属性
self.xxx与方法入参xxx的核心区别 两者的差异主要在存储范围、取值逻辑、适用场景三个维度:
存储与生命周期不同
self.message是绑定在实例对象上的属性,属于实例本身的持久化成员,只要实例没有被垃圾回收,这个属性就会一直存在,类内所有的实例方法都可以随时读取、修改这个属性,不会因为单个方法执行结束就消失。
而直接调用的message是当前方法的局部变量,仅在本次talk方法执行期间有效,方法运行结束后就会被销毁,其他类方法完全无法访问这个变量。取值逻辑完全不同
self.message的取值和当前方法的入参没有任何关系,它的值要么来自实例初始化方法__init__的赋值,要么来自其他实例方法运行时的赋值。如果实例从来没有被赋值过message属性,哪怕你调用talk方法的时候传了参数,运行第一段示例代码也会直接抛出AttributeError错误,而且完全不会用到你传入的message参数值。
而局部变量message的取值完全来自本次调用talk方法时传入的实参,每次调用都可以传入不同的值,只要传参符合方法定义的要求就不会报错。
两段示例代码的运行差异非常明显:
错误用法示例(忽略入参,强制取实例属性):
def talk(self, message): print("{} sad : {}".format(self.name, self.message))
调用
实例.talk("今天加班到10点")时,不会输出你传入的加班内容,只会读取实例之前存储的message属性值,没存就直接报错。
正确用法示例(直接使用本次入参):
def talk(self, message): print("{} sad : {}".format(self.name, message))
调用
实例.talk("今天加班到10点")就会直接输出你传入的内容,每次调用传不同参数就能输出不同结果。
- 适用场景不同
如果变量对应的是实例的固有属性,需要跨多个方法复用、需要长期保留在实例上的,比如用户昵称、账户余额,就用self.xxx绑定到实例上存储。
如果变量只是本次调用方法时临时传入的参数,用完就不需要了,不需要给其他方法复用的,直接用方法入参即可。
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

