是否无法将实例变量作为方法关键字的默认值传递?
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
问题
- 这是为什么?
self.name
是否在 class 的初始化时尚未定义?
- 有没有办法在 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")
这行不通:
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
问题
- 这是为什么?
self.name
是否在 class 的初始化时尚未定义? - 有没有办法在 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")