蒙珣的博客

活好当下,做好今天该做的事情。

0%

Python 面向对象练习

  1. 简述面向对象的三大特性?

    • 封装:将方法封装到类中 或 将数据封装到对象中,以便以后使用

    • 继承:将类中的公共的方法提取到基类中去实现

    • 多态:Python默认支持多态(这种方式称之为鸭子类型),最简单的基础下面的这段代码即可

      1
      2
      3
      def func(arg):
      v1 = arg.copy() # 浅拷贝
      print(v1)
  2. 将以下函数改成类的方式并调用

    1
    2
    def func(a1):
    print(a1)
    1
    2
    3
    4
    5
    6
    class Test():
    def func(self,a1):
    print(a1)

    b = Test()
    b.func(222)
  3. 面向对象中的self指的是什么?

    self 是一个参数,在通过对象、方法 的方式去执行方法时,这个参数会被python自动传递(值为调用当前方法的对象)

  4. 以下代码体现面向对象的什么特性?

    1
    2
    3
    4
    5
    6
    7
    class Person(object):
    def __init__(self, name, age, gender):
    self.name = name
    self.age = age
    self.gender = gender

    obj = Person('蒙珣',18,'男')

    体现了封装的特性,将 蒙珣, 18, 男 封装到 obj 对象中

  5. 以下代码体现面向对象什么特性?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Message(object):
    def email(self):
    """
    发送邮件
    """
    pass

    def msg(self):
    """
    发送短信
    """
    pass

    def wechat(self):
    """
    发送微信
    """
    pass

    依然是封装,将email、msg、wechat这些功能封装到 Message 中

  6. 看代码写结果

    1
    2
    3
    4
    5
    6
    7
    class Foo:
    def func(self):
    print('foo.func')

    obj = Foo()
    result = obj.func()
    print(reslut)
    1
    2
    >>> foo.func # 函数被实例化的时候会被执行
    >>> none # 函数没有返回值,所以result是none
  7. 看代码写结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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.f2')

    class Foo(Base1, Base2):
    def f0(self):
    print('foo.f0')
    self.f3()

    obj = Foo()
    obj.f0()
    1
    2
    3
    4
    5
    6
    # 函数继承的考察,Foo(Base1,Base2)。中Base1先写,所以优先级比Base2高。
    >>> foo.f0
    >>> base1.f3
    >>> base1.f1
    # self是obj对象,在class Base1的 def f3(self) 中,调用了self.f1()
    # 程序会先去class Foo(Base1, Base2)类中找f1(), 如果没有再去Base1中找
  8. 看代码写结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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()
    1
    2
    3
    4
    5
    >>> foo.f2
    >>> foo.f1
    >>> base.f3
    # self是obj对象,在class Base类的f3()中调用self.f1()
    # 程序先到class Foo()中找f1()方法,如果有就执行,没有再去所继承的Base()类中寻找
  9. 补充代码实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    user_lsit = []
    while True:
    user = input('请输入用户名:')
    pwd = input('请输入密码')
    email = input'请输入邮箱:'

    """
    # 需求
    1. while循环提示 用户输入:用户名、密码、邮箱(正则满足邮箱格式)
    2. 为每个用户创建一个个对象,并添加到user_list中
    3. 当列表中的添加 3个对象后,跳出循环并以此循环打印所有用户的姓名和邮箱
    """
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import re
    class UserInfo(object):
    def __init__(self, name, pwd, email):
    self.name = name
    self.pwd = pwd
    self.email = email

    def run():
    user_list = []
    while True:
    user = input('请输入用户名:')
    pwd = input('请输入密码')
    email = input('请输入邮箱:')
    match_object = re.match("(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)", email, re.ASCII)
    if not match_object:
    print("邮箱格式输入错误,请重新输入")
    continue

    user_object = UserInfo(user, pwd, email)
    user_list.append(user_object)
    if len(user_list) == 3:
    break

    for item in user_list:
    print(item.name, item.email)

    if __name__ == '__main__':
    run()
  10. 补充代码,实现用户注册和登录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    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中校验用户名合法性
    """
    pass

    def register(self):
    """
    用户注册,每注册一个用户就创建一个user对象,然后添加到self.user_list中,表示注册成功
    """
    pass

    def run(self):
    """
    主程序
    """
    pass

    if __name__ == '__main__':
    obj = Account()
    obj.run()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    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中校验用户合法性
    :return:
    """
    print("用户登录")
    while True:
    user = input("请输入用户名(Q/q):")
    if user.upper() == 'Q':
    break
    pwd = input("请输入密码:")

    for user_object in self.user_list:
    if user == user_object.name and pwd == user_object.pwd:
    print("登录成功")
    break
    else:
    print("登录失败")

    def register(self):
    """
    用户注册,没注册一个用户就创建一个user对象,然后添加到self.user_list中,表示注册成功。
    :return:
    """
    print("用户注册")
    while True:
    user = input("请输入用户名(Q/q):")
    if user.upper() == 'Q':
    break
    pwd = input("请输入密码:")
    user_object = User(user, pwd)
    self.user_list.append(user_object)

    def run(self):
    """
    主程序
    :return:
    """
    method_dict = {
    "1": {"title": "登录", "method": self.login},
    "2": {"title": "注册", "method": self.register},
    }
    message = ";".join(["{}.{}".format(k, v['title']) for k, v in method_dict.items()])

    while True:
    print(message)
    choice = input("请选择功能(Q/q):")
    if choice.upper() == 'Q':
    break
    info = method_dict.get(choice)
    if not info:
    print("选择错误,请重新选择")
    continue
    method = info['method']
    method() # self.login() / self.register()

    if __name__ == '__main__':
    obj = Account()
    obj.run()