zoukankan      html  css  js  c++  java
  • 24 练习题:利用类理解queue和stack 经典类与新式类

    # 1.mypickle照着写json
    # 实现自定义类栈和队列,并使用继承简化
    
    import json
    
    
    class My_json:
        def __init__(self, path):
            self.path = path
    
        def my_load(self):
            with open(self.path, encoding='utf-8', mode='r') as file_handler:
                ret = json.load(file_handler)
                return ret
    
        def my_dump(self, elements):
            with open(self.path, encoding='utf-8', mode='a') as file_handler:
                json.dump(elements, file_handler)
    
    
    # obj = My_json('temp')
    # obj.my_dump('123456')
    # print(obj.my_load())
    
    
    # 2.多继承的继承顺序
    # 只知道mro能够查看C3的结果就可以
    # https://www.processon.com/view/link/5bf6690be4b08c22eea64888  3vgb
    # 2.1
    class G(object): pass
    
    
    class F(G): pass
    
    
    class E: pass
    
    
    class D(G): pass
    
    
    class C(E): pass
    
    
    class B(F): pass
    
    
    class A(B, C, D): pass
    
    
    print(A.mro())
    
    
    # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.F'>, <class '__main__.C'>,
    # <class '__main__.E'>, <class '__main__.D'>, <class '__main__.G'>, <class 'object'>]
    
    # 2.2
    class G(object): pass
    
    
    class F(object): pass
    
    
    class E(G): pass
    
    
    class D(F): pass
    
    
    class C(E): pass
    
    
    class B(D, E): pass
    
    
    class A(B, C): pass
    
    
    print(A.mro())
    
    
    # G: [GO]
    # F: [FO]
    # D: [DFO]
    # E: [EGO]
    # C: [CEGO]
    # B: B + merge([DFO] + [EGO]) = [BDFEGO]
    # A: A + merge([BDFEGO] + [CEGO]) = [ABDFCEGO]
    # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.F'>,
    # <class '__main__.C'>, <class '__main__.E'>, <class '__main__.G'>, <class 'object'>]
    
    
    # 2.3
    class G(object): pass
    
    
    class F(object): pass
    
    
    class E(G): pass
    
    
    class D(object): pass
    
    
    class C(D, F): pass
    
    
    class B(D, E): pass
    
    
    class A(B, C): pass
    
    
    print(A.mro())
    
    
    # G: [GO]
    # F: [FO]
    # D: [DO]
    # E: [EGO]
    # C: C + merge([DO] + [FO]) = [CDFO]
    # B: B + merge([DO] + [EGO]) = [BDEGO]
    # A: A + merge([BDEGO] + [CDFO]) = [ABCDEGFO]
    # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>,
    # <class '__main__.E'>, <class '__main__.G'>, <class '__main__.F'>, <class 'object'>]
    
    
    # 3.面向对象中为什么要有继承?
    # 继承可以很好地实现相似的类之间的交流、节省代码、同时也可以通过继承抽象类来规定某些类的写法
    
    
    # 4.Python继承时,查找成员的顺序遵循什么规则?
    # 经典类主要使用图的深度优先查找算法,而在新式类的MRO Method Resolution Order主要遵守C3算法来计算查找成员的顺序。
    
    
    # 5.看代码写结果
    class Base1:
        def f1(self):
            print('base1.f1')
    
        def f2(self):
            print('base1.f2')
    
        def f3(self):
            print('base1.f3')
            self.f1()
    
    
    class Base2:
        def f1(self):
            print('base2.f1')
    
    
    class Foo(Base1, Base2):
        def f0(self):
            print('foo.f0')
            self.f3()
    
    
    obj = Foo()
    obj.f0()
    
    
    # foo.f0
    # base1.f3
    # base1.f1
    
    
    # 6.看代码写结果
    class Base:
        def f1(self):
            print('base.f1')
    
        def f3(self):
            self.f1()
            print('base.f3')
    
    
    class Foo(Base):
        def f1(self):
            print('foo.f1')
    
        def f2(self):
            print('foo.f2')
            self.f3()
    
    
    obj = Foo()
    obj.f2()
    # foo.f2
    # foo.f1
    # base.f3
    
    
    # 7.补充代码实现下列需求
    """
    # 需求
    1. while循环提示户输 : 户名、密码、邮箱(正则满 邮箱格式)
    2. 为每个户创建个对象,并添加到表中。
    3. 当表中的添 3个对象后,跳出循环并以此循环打印所有户的姓名和邮箱
    """
    
    
    class User:
        def __init__(self, name, password, email):
            self.name = name
            self.password = password
            self.email = email
    
    
    # user_list = []
    # while True:
    #     user = input('请输入用户名:')
    #     pwd = input('请输入密码:')
    #     email = input('请输入邮箱:')
    #     new_user = User(user, pwd, email)
    #     user_list.append(new_user)
    #     if len(user_list) == 3:
    #         for i in user_list:
    #             print(i.name, i.password, i.email)
    #         break
    
    
    # 8.补充代码,实现用户登录和注册
    class User:
        def __init__(self, name, pwd):
            self.name = name
            self.pwd = pwd
    
    
    class Account:
        def __init__(self):
            # 用户列表,数据格式:[user对象,user对象,user对象]
            self.user_list = []
    
        def login(self):
            """
            用户登录,输入用户名和密码然后去self.user_list中校验用户合法性
            """
            for count in range(3):
                if not self.user_list:
                    print('Pls register first.')
                    return
                username = input('username:')
                password = input('password:')
                for i in self.user_list:
                    if username == i.name and password == i.pwd:
                        print('Login success.')
                        return
                    print('Incorrect account or password.')
    
        def register(self):
            """
            用户注册,没注册一个用户就创建一个user对象,然后添加到self.user_list中,表示注册成功。
            """
            while True:
                while True:
                    username = input('username:')
                    password = input('password:')
                    password_again = input('password again:')
                    if password == password_again:
                        break
                    print('Entered passwords differ.')
                if not self.user_list:
                    new_user = User(username, password)
                    self.user_list.append(new_user)
                    return
                for i in self.user_list:
                    if username != i.name:
                        new_user = User(username, password)
                        self.user_list.append(new_user)
                        return
                    print('This username has been registered.')
    
        def run(self):
            """
            主程序
            """
            mode_list = ['login', 'register']
            while True:
                while True:
                    for i in enumerate(mode_list):
                        print(i[0] + 1, i[1])
                    choose = input('Pls choose ur mode(input mode num, input q to quit) >>>')
                    if choose.upper() == 'Q':
                        return
                    elif choose.isdecimal():
                        if int(choose) == 1 or int(choose) == 2:
                            break
                    print('Illegal input.')
                choose = int(choose)
                if hasattr(self, mode_list[choose - 1]):
                    if callable(getattr(self, mode_list[choose - 1])):
                        getattr(self, mode_list[choose - 1])()
    
    
    if __name__ == '__main__':
        obj = Account()
        obj.run()
    
    
    #     9.读代码写结果
    class Base:
        x = 1
    
    
    obj = Base()
    print(obj.x)
    obj.y = 123
    print(obj.y)
    obj.x = 123
    print(obj.x)
    print(Base.x)
    
    
    # 1
    # 123
    # 123
    # 1
    
    
    # 10.读代码写结果
    class Parent:
        x = 1
    
    
    class Child1(Parent):
        pass
    
    
    class Child2(Parent):
        pass
    
    
    print(Parent.x, Child1.x, Child2.x)
    Child2.x = 2
    print(Parent.x, Child1.x, Child2.x)
    Child1.x = 3
    print(Parent.x, Child1.x, Child2.x)
    
    
    # 1 1 1
    # 1 1 2
    # 1 3 2
    
    
    # 11.看代码写结果
    class Foo(object):
        n1 = '武沛齐'
        n2 = '金老板'
    
        def __init__(self):
            self.n1 = 'eva'
    
    
    obj = Foo()
    print(obj.n1)
    print(obj.n2)
    
    
    # eva
    # 金老板
    
    
    # 12.看代码写结果,【如果有错误,则标注错误即可,并且假设程序报错可以继续执行】
    
    class Foo(object):
        n1 = '武沛齐'
    
        def __init__(self, name):
            self.n2 = name
    
    
    obj = Foo('太白')
    print(obj.n1)
    print(obj.n2)
    print(Foo.n1)
    print(Foo.n2)
    # 武沛齐
    # 太白
    # 武沛齐
    # 报错
    
    
  • 相关阅读:
    SQL查询,所有的客户订单日期最新的前五条订单记录。
    session的原理
    @RequestMapping 注解用在类上面有什么作用?
    事务的概念,在JDBC编程中处理事务的步骤
    .Redis优势
    Spring框架中都用到了哪些设计模式?
    redis
    你为什么觉得自己能够在这个职位上取得成就?
    怎样理解团队?请举例并说明启示。
    物质待遇和工作条件是人们选择工作的重要因素之一,这次报考谈一谈你在选择工作时都考虑哪些因素?为什么?
  • 原文地址:https://www.cnblogs.com/raygor/p/13366606.html
Copyright © 2011-2022 走看看