首页 > 解决方案 > 是否不可能将实例变量作为方法关键字的默认值传递?

问题描述

这将不起作用:

class myClass:

    def __init__(self, name):
        self.name = name

    def methodA(self, name=self.name):
        print(f"Hello {name}!")

myInstance = myClass("Frank")

因为:

NameError: name 'self' is not defined

问题

  1. 这是为什么?是self.name不是在类的初始化时就已经定义了?
  2. 有没有办法name在类实例的初始化时定义,同时在调用特定方法时也能改变它的值?myInstance.name = "Peter"在调用方法之前,我不想总是用单独的行(例如:)更改它的值。而且,我也不想被迫使用关键字传递它(例如:def methodB(self, name=name_typed_when_calling_method)每次我调用使用该变量的方法时。

标签: pythonclassoopinstanceself

解决方案


self在评估默认参数时未定义,即在定义方法时。它只是一个函数参数,在调用方法时会绑定到一个参数。

您需要做的是使用标记(如)作为默认值,并None定义的方法体内检查该标记。self

class myClass:

    def __init__(self, name):
        self.name = name

    def methodA(self, name=None):
        if name is None:
            name = self.name
        print(f"Hello {name}!")

myInstance = myClass("Frank")

推荐阅读