Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中缩写setter?_Python - Fatal编程技术网

在python中缩写setter?

在python中缩写setter?,python,Python,我是python新手。我有一个类User,我只需要init表达式中“self”附近的用户名。 我正在使用添加首名更改首名,使用添加首名更改姓氏。为了避免重复,是否可以将其缩写 class User: def __init__(self, username): self.username = username self.first_name = "" self.last_name = "" def add_first_name(se

我是python新手。我有一个类User,我只需要init表达式中“self”附近的用户名。 我正在使用添加首名更改首名,使用添加首名更改姓氏。为了避免重复,是否可以将其缩写

class User:
    def __init__(self, username):
        self.username = username
        self.first_name = ""
        self.last_name = ""

    def add_first_name(self, fn)
        self.first_name = fn

    def add_last_name(self, ln)
        self.last_name = ln
类似于以下内容(伪代码):


在其中,我将调用如下内容:add_parameter(self.first_name=“Jonh”)为了避免重复,您可以直接设置属性,而无需任何setter或getter

class User:
    def __init__(self, username):
        self.username = username
        self.first_name = ""
        self.last_name = ""


user = User("some name")
user.first_name = "John"
user.last_name = "Smith"

最好的方法是直接访问属性:

class User:
    def __init__(self, username):
        self.username = username
        self.first_name = ""
        self.last_name = ""


user = User("")
user.first_name = "John"
user.last_name = "Smith"
您还可以使用
\uuuuu getattribute\uuuuu
\uuuuu setattr\uuuuuu
方法来控制属性的访问方式:

class User:
    def __init__(self, username):
        self.username = username
        self.first_name = ""
        self.last_name = ""
    def __setattr__(self, name, value):
        #Set attribute
    def __getattr__(self, name):
        #Get attribute

user = User("")
user.first_name = "John"
user.last_name = "Smith"

只要用代码更改“#Set attribute”和“#Get attribute”即可设置或获取属性。

我想我会为此大发雷霆,因为没有其他人提到使用
@property
。这很容易

class User:
    def __init__(self, username):
        self.username = username
        self.first_name = ""
        self.last_name = ""

    @property
    def first_name(self):
        # Here you can modify first_name however you want before you return it
        return self.first_name

    @first_name.setter
    def first_name(self, fn):
        # Here you can modify fn however you want before you set it.
        self.first_name = fn

    @property
    def last_name(self):
        # Here you can modify last_name however you want before you return it
        return self.last_name

    @last_name.setter
    def last_name(self, ln):
        # Here you can modify ln however you want before you set it.
现在你可能认为这是难以置信的冗长,你是对的!但有两个原因。首先,在Python中,有getter和setter是不寻常的(并不是说它们永远没有位置)。这看起来相当冗长的第二个原因是,它实际上做了比创建
get\u first\u name
set\u first\u name
更好的事情。它允许您执行以下操作:

u = User("test_user")
u.first_name = "Test"
u.last_name = "User"
print(u.first_name)
>>> "Test"

它将自动为您调用getter和setter,而无需实际编写完整的函数调用。它是纯语法糖吗?是的,当然可以,但是由于getter和setter在Python中不是标准的,所以它也可以帮助其他人更容易地遵循您的代码。

您有什么理由必须使用setter吗?你不能直接设置属性吗?为什么要设置setter呢?如果你来自Python以外的语言,那么这可能会让你感到奇怪,但是在Python中,设置setter和getter是很少见的,除非它们是显式必需的(例如,你实际上要转换值或进行一些错误检查)。即使您认为需要getter和setter,使用
@属性
也更合适。请看这里:不要使用setterWhy?因为我的一些背景是其他语言,所以我在doc中发现了一个使用它的示例:。也谢谢@NickChapman的推荐我接受你的答案,因为这是我一直在寻找的与问题本身相关的东西,它真的很有趣,而且是一个官方功能。。。其他的答案对我来说也是可以接受的,我正在平衡双方——我不太关注二传手和传接手,因为我想python就是以这种方式驱动的。对我来说,你回答中的黄金部分是:帮助其他人更容易地遵循你的代码
u = User("test_user")
u.first_name = "Test"
u.last_name = "User"
print(u.first_name)
>>> "Test"