【发布时间】:2021-09-21 03:54:25
【问题描述】:
我正在尝试在我的子类中获取一个方法来设置父类的属性,如下所示:
我的父类:
class user_credentials:
def __init__(self):
self.username= ""
# -----------------------------
# Getters & setters for attributes
#------------------------------
@property
def username(self):
return self._username
@username.setter
def username(self, username):
while (username == ''):
username = input('Enter a proper User name, blank is not accepted')
self._username = username
在我的子类中,我想在方法中设置属性,如下所示:
# Manage login requests for user
class login_manager(user_credentials):
def __init__(self):
super().__init__()
self.success_value = None
self.error_message = None
def request_login(self):
super(login_manager, self).username = input("Enter your user name")
当我调用对象执行request_login方法时:
lm1 = login_manager()
lm1.request_login()
我得到以下错误回溯:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-9-a712c3363bb9> in <module>
1 lm1 = login_manager()
----> 2 lm1.request_login()
3 lm1.login_request_success()
4 lm1.print_members()
<ipython-input-8-def865430eaf> in request_login(self)
12 def request_login(self):
---> 14 super(login_manager, self).username = input("Enter your user name")
AttributeError: 'super' object has no attribute 'username'
我一直在对此进行一些研究,但我似乎找不到有人试图在子类中使用父类中的 setter 的示例。
我做错了什么?
【问题讨论】:
-
这实际上会抛出错误
AttributeError: 'super' object has no attribute 'email'。 -
Python 不是 Java,如果您的 getter 或 setter 没有任何有用的事情可做(如您的),那么您无需编写任何东西。
-
无论哪种方式,类都会继承方法和所有其他描述符(如属性)。只需使用
self.email = input("Enter your user email")。关于属性的全部要点是,您通常不必知道属性是否是属性。 -
对不起,我不明白。为什么不使用 self.attribute 不允许 setter 进行检查?
self.username只有一个实现,它必须 使用必须 进行检查的setter。你希望setter做哪些检查,直接访问时不做哪些检查? -
注意,按照惯例,
property应该表现得“好像”它是一个属性。具体来说,如果用户不喜欢,属性通常不会暂停并要求用户覆盖其值。获得用户的有效输入应该是request_login的责任;username应该在给出无效数据时中止。
标签: python oop python-class