[英]Python can't use setter
here is my issue, when i'm using @property decorator I can't use setter这是我的问题,当我使用@property 装饰器时我不能使用 setter
class Worker:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def set_name(self,new_name):
self.__name = new_name
worker1 = Worker('A')
print(worker1.name)
worker1.name = 'B'
print(worker1.name)
It gives AttributeError: can't set attribute 'name', when I use setter它给出了 AttributeError: can't set attribute 'name', when I use setter
Let's rewrite this without decorator syntax.让我们在没有装饰器语法的情况下重写它。
class Worker:
def __init__(self,name):
self.__name = name
def name(self):
return self.__name
name = proprety(name)
def set_name(self,new_name):
self.__name = new_name
set_name = name.setter(set_name)
This makes it easier to see that you now have two similar properties: name
, which only provides read-only access to the __name
attribute, and set_name
, which has a getter and a setter for the same attribute.这使您更容易看出您现在拥有两个相似的属性:
name
和set_name
,前者仅提供对__name
属性的只读访问,后者具有同一属性的 getter和setter。 name.setter
takes a method, and returns a new property that replaces the old setter (if any) of name
with the given function. name.setter
采用一个方法,并返回一个新属性,该属性用给定的 function 替换name
的旧设置器(如果有)。
You want a single property named name
, so you must use the same name when defining the setter.您需要一个名为
name
的属性,因此在定义 setter 时必须使用相同的名称。
class Worker:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
name = proprety(name)
@name.setter
def name(self,new_name):
self.__name = new_name
The decorators are a way to simplify code like the following:装饰器是一种简化代码的方法,如下所示:
class Worker:
def __init__(self,name):
self.__name = name
def get_name(self):
return self.__name
def set_name(self,new_name):
self.__name = new_name
name = property(get_name, set_name)
del get_name, set_name
Change set_name
to name
.将
set_name
更改为name
。
Python docs for @property : @property 的 Python 文档:
Be sure to give the additional functions the same name as the original property (x in this case.)
请务必为附加函数指定与原始属性相同的名称(在本例中为 x。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.