Class 对象在使用 属性 装饰器时同时包含 _<var> 和 <var> 属性
Class objects contains both _<var> and <var> attributes when using property decorator
我有以下 class。如果用户没有为此提供值,我想保留 _my_var = None。他们可以使用 setter 来设置它,我在其中强制执行一些验证
class A:
_my_var = None
@property
def my_var(self):
return self._my_var
@property.setter
def my_var(self, value)
# Some validation
return._my_var = value
我在下面的代码中创建一个对象
x = A()
当我查看 x 的属性时
_my_var: None
my_var: None
当我设置 x._myvar = 10
时,my_var
和 _my_var
属性都设置为 10。我对此感到困惑。 _my_var 是一个字段而 my_var 是一个函数吗?如何在强制设置 setter 的同时仅保留 _my_var 作为属性?
是因为你把my_var
变成了属性,但是在函数里面return变成了self._my_var
,所以如果你把self._my_var
改成10
,然后您再次调用 my_var
函数,它将 return 修改后的 self._my_var
值。
将 my_var
函数设置为 @property
可能会让您感到困惑,它的行为就像它只是 class 的属性一样,但它实际上是一个函数,只是调用时没有括号.如果你把它变成一个没有 @property
的常规函数,比如:
def my_var(self):
return self._my_var
那么它是一个函数会更明显,因为你会这样称呼它:
x._myvar = 10
print(x.my_var())
会给:
10
这样会更明显。
为了让它不根据_my_var
改变,把函数改成一个变量,所以不是:
def my_var(self):
return self._my_var
成功:
self.my_var = int(self._my_var)
我有以下 class。如果用户没有为此提供值,我想保留 _my_var = None。他们可以使用 setter 来设置它,我在其中强制执行一些验证
class A:
_my_var = None
@property
def my_var(self):
return self._my_var
@property.setter
def my_var(self, value)
# Some validation
return._my_var = value
我在下面的代码中创建一个对象
x = A()
当我查看 x 的属性时
_my_var: None
my_var: None
当我设置 x._myvar = 10
时,my_var
和 _my_var
属性都设置为 10。我对此感到困惑。 _my_var 是一个字段而 my_var 是一个函数吗?如何在强制设置 setter 的同时仅保留 _my_var 作为属性?
是因为你把my_var
变成了属性,但是在函数里面return变成了self._my_var
,所以如果你把self._my_var
改成10
,然后您再次调用 my_var
函数,它将 return 修改后的 self._my_var
值。
将 my_var
函数设置为 @property
可能会让您感到困惑,它的行为就像它只是 class 的属性一样,但它实际上是一个函数,只是调用时没有括号.如果你把它变成一个没有 @property
的常规函数,比如:
def my_var(self):
return self._my_var
那么它是一个函数会更明显,因为你会这样称呼它:
x._myvar = 10
print(x.my_var())
会给:
10
这样会更明显。
为了让它不根据_my_var
改变,把函数改成一个变量,所以不是:
def my_var(self):
return self._my_var
成功:
self.my_var = int(self._my_var)