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)
# 武沛齐
# 太白
# 武沛齐
# 报错

posted @ 2020-07-23 15:31  Raigor  阅读(139)  评论(0)    收藏  举报