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