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