
class DepartmentIT:
    PYTHON_DEV = 3
    GO_DEV = 3
    REACT_DEV = 2

    def info(self):
        print(self.PYTHON_DEV, self.GO_DEV, self.REACT_DEV)

    @property
    def info_prop(self):
        print(self.PYTHON_DEV, self.GO_DEV, self.REACT_DEV)


class MyClass:
    class_attribute = 'I am a class attribute'

    def __init__(self) -> None:
        self.instance_attribute = 'I am an instatnce attribute'

    @classmethod
    def create_attr(cls, attr_name, attr_value):
        setattr(cls, attr_name, attr_value)


class Container:
    items = []

    def add_item(self, value):
        # self.items.append(value)
        self.items = [value] + self.items


class Robot:

    population = 0
    my_list = []

    def __init__(self, name) -> None:
        # Robot.population += 1
        self.population += 1
        self.name = name
        self.my_list.append(name)
        print(f'Робот {self.name} был создан')

    def destroy(self):
        print(f'Робот {self.name} был уничтожен')
        # Robot.population -= 1
        self.population -= 1

    def say_hello(self):
        print(f'Робот {self.name} приветствует тебя, особь человеческого рода')

    def how_many_new(self):
        print(f'{self.population}, вот сколько нас еще осталось')

    @classmethod
    def how_many(cls):
        # print(f'{cls.population}, вот сколько нас еще осталось')
        print(f'{cls.population}, вот сколько нас еще осталось')
        

class User:

    def __init__(self, name, role) -> None:
        self.name = name
        self.role = role


class Access:

    __access_list = ['admin', 'developer']

    def __init__(self) -> None:
        pass

    @staticmethod
    def __check_access(role):
        return True if role in Access.__access_list else False

    @staticmethod
    def get_access(user: User):
        if not isinstance(user, User):
            print('AccessTypeError')
            return
        if Access.__check_access(user.role):
            print(f'User {user.name}: success')
        else:
            print(f'AccessDenied')


class BankAccount:

    bank_name = 'Tinkoff Bank'
    address = 'Москва, ул. 2-я Хуторская, д. 38А'

    def __init__(self, name, balance) -> None:
        self.name = name
        self.balance = balance

    @classmethod
    def create_account(cls, name, balance):
        return cls(name, balance)
    
    @classmethod
    def bank_info(cls):
        return f"{cls.bank_name} is located in {cls.address}"


def main():

    oleg = BankAccount.create_account("Олег Тинкофф", 1000)
    assert isinstance(oleg, BankAccount)
    assert oleg.name == 'Олег Тинкофф'
    assert oleg.balance == 1000
    assert BankAccount.bank_info() == 'Tinkoff Bank is located in Москва, ул. 2-я Хуторская, д. 38А'

    ivan = BankAccount.create_account("Ivan Reon", 50)
    assert isinstance(ivan, BankAccount)
    assert ivan.name == 'Ivan Reon'
    assert ivan.balance == 50
    print('Good')

    '''
    user1 = User('batya99', 'admin')
    Access.get_access(user1) # печатает "User batya99: success"

    zaya = User('milaya_zaya999', 'user')
    Access.get_access(zaya) # печатает AccessDenied

    Access.get_access(5) # печатает AccessTypeError
    '''

    '''
    box1 = Container()
    box1.add_item(2)
    box1.add_item(4)


    box2 = Container()
    box2.add_item(5)
    box2.add_item(7)

    print(Container.items)
    '''

    '''
    droid1 = Robot("R2-D2")
    print(droid1.name)
    print(Robot.population)
    assert droid1.name == 'R2-D2'
    # assert Robot.population == 1
    droid1.say_hello()
    Robot.how_many()
    droid1.how_many_new()
    droid2 = Robot("C-3PO")
    assert droid2.name == 'C-3PO'
    # assert Robot.population == 2
    droid2.say_hello()
    droid2.how_many_new()
    Robot.how_many()
    droid1.how_many_new()
    droid1.destroy()
    # assert Robot.population == 1
    droid2.destroy()
    # assert Robot.population == 0
    Robot.how_many()
    '''
    

    '''
    example_1 = MyClass()
    example_2 = MyClass()
    example_3 = MyClass()

    example_1.create_attr('new_attr', 'Hello world')

    print(example_1.new_attr)
    print(example_2.new_attr)
    print(example_3.new_attr)
    '''
    
    '''
    dep1 = DepartmentIT()
    dep2 = DepartmentIT()

    print(dep1.REACT_DEV)
    dep1.REACT_DEV = 5
    print(dep1.REACT_DEV)
    print(dep2.REACT_DEV)

    dep3 = DepartmentIT()
    print(dep3.REACT_DEV)
    '''


if __name__ == '__main__':
    main()