7. Пользователи.
Условие:
1. Нужно создать класс User. Атрибуты объектов: имя, логин и пароль. Атрибут самого класса: счётчик объектов.
Методы для объектов класса User со свойствами, которые нужно создать:
- geter и seter для имени
- только geter для логина
- geter и seter для пароля, при котором geter выводит пароль в виде "*********"
Также нужно создать метод для отображения состояния атрибутов объекта вместе, таких как имя и логин.
Нужно создать класс-наследник класса User под названием SuperUser, который будет расширен атрибутом роль для всех объектов класса. Атрибутом самого класса тоже будет счётчик объектов.
Код:
class User:
count = 0 # создадим атрибут класса - счётчик регистраций
def __init__(self, name, login, password): # создаём атрибуты объекта
self.__name = name
self.__login = login
self.__password = password
User.count += 1 # прибавляет +1 к каждой регистрации
def __repr__(self):
return f"Имя: {self.__name}. Логин: {self.__login}."
def get_name(self): # создадим geter и seter для инкапсулированного атрибута self.__name
return self.__name
def set_name(self, value):
self.__name = value
name = property(get_name, set_name)
def get_login(self): # создадим geter и seter для инкапсулированного атрибута self.__login
return self.__login
def set_login(self, value): # выдаст исключение, если произойдёт попытка изменения login, так лучше, чем просто не делать seter
raise AttributeError("Нельзя менять значение!")
login = property(get_login, set_login)
def get_password(self): # создадим geter и seter для инкапсулированного атрибута self.__password
return "***********"
def set_password(self, value):
self.__password = value
password = property(get_password, set_password)
def show_info(self): # создадим метод показывающий состояние атрибутов объекта (имени и логина)
print(f"Name: {self.__name}")
print(f"Login: {self.__login}")
class SuperUser(User): # создадим класс-наследник
count = 0 # по анологии создадим атрибут для класса-наследника - счётчик регистраций
def __init__(self, name, login, password, role): # создаём атрибуты объекта класса-наследника путём наследования части их от родителя
super().__init__(name, login, password)
self.__role = role
SuperUser.count += 1 # прибавляет +1 к каждой регистрации
User.count -= 1 # нужно обязательно отнять 1 у суперкласса, т.к. наше обращение прибавило там единицу, и super() здесь не сработает, поэтому обращаемся в атрибуту супер-класса напрямую
def __repr__(self):
s = super().__repr__()
return f"{s} Роль: {self.__role}."
@property # создадим geter и seter для инкапсулированного атрибута self.__role с помощью декораторов
def role(self):
return self.__role
@role.setter
def role(self, value):
self.__role = value
def show_info(self): # создадим метод показывающий состояние атрибутов объекта (имени и логина, которых наследует + нового атрибута role)
super().show_info()
print(f"Role: {self.__role}")
################### тест ##############################################################################
user1 = User("Paul McCartney", "paul", "1234")
user2 = User("George Harrison", "george", "5678")
user3 = User("Ringo Starr", "ringo", "qwerty")
admin = SuperUser("John Lennon", "john", "password", "admin")
print()
print(f"{user1}\n{user2}\n{user3}\n{admin}\n")
print(f"Обычных пользователей: {User.count}. Админов: {SuperUser.count}.\n")