简体   繁体   English

Python 不能使用二传手

[英]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.这使您更容易看出您现在拥有两个相似的属性: nameset_name ,前者仅提供对__name属性的只读访问,后者具有同一属性的 gettersetter。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM