是否无法将实例变量作为方法关键字的默认值传递?

Is it impossible to pass a instance variable as default of a method keyword?

这行不通:

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 是否在 class 的初始化时尚未定义?
  2. 有没有办法在 class 实例的初始化时定义 name,同时在调用特定方法时还能够更改其值?在调用方法之前,我不想总是用单独的一行更改它的值(例如:myInstance.name = "Peter")。而且,我也不想被迫使用关键字传递它(例如:def methodB(self, name=name_typed_when_calling_method) 每次调用使用该变量的方法时。

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

时,它会绑定到一个参数

你需要做的是使用一个哨兵(比如None)作为默认值,并在方法体内检查 self is 已定义。

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")