• 面向对象和函数式编程的思想差异
    • 函数式的思想:函数内部需要的数据均通过参数的形式传递。
    • 面向对象的思想:将一些数据封装到对象中,在执行方法时,再去对象中获取。
  • 类和对象的关系
    • 对象是类的实例化,是基于类实例化出来”一块内存“,默认里面没有数据;经过类的 __init__方法,可以在内存中初始化一些数据。
  • self是什么
    • self,本质上就是一个参数。这个参数是Python内部会提供,其实本质上就是调用当前方法的那个对象。也就是说self指的是对象,而不是类!
  • 面向对象编程中常见的成员
    • 绑定方法
    • 实例变量
  • 面向对象的三大特性
    • 封装,将方法封装到类中 或 将数据封装到对象中,便于以后使用。
    • 继承,将类中的公共的方法提取到基类中去实现。
      • 执行对象.方法时,优先去当前对象所关联的类中找,没有的话才去她的父类中查找。
      • Python支持多继承:先继承左边、再继承右边的。
      • self到底是谁?去self对应的那个类中去获取成员,没有就按照继承关系向上查找 。
        ```python class Base: def f1(self): print(‘before’) self.f2() # self是obj对象(Foo类创建的对象) obj.f2 print(‘base.f1’) def f2(self): print(‘base.f2’)

class Foo(Base): def f2(self): print(‘foo.f2’)

obj = Foo() obj.f1() # 优先去Foo类中找f1,因为调用f1的那个对象是Foo类创建出来的。

before foo.f2 # 注意这里不是base.f1,而是foo.f2,因为self指的是foo,而foo有f2 base.f1 ```

  • 多态,Python默认支持多态(这种方式称之为鸭子类型),在鸭子类型中,关注点在于对象的行为,能作什么;而不是关注对象所属的类型,例如:一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟可以被称为鸭子。最简单的基础下面的这段代码即可。
    ```python class Email(object): def send(self): print(“发邮件”)

class Message(object): def send(self): print(“发短信”)

def func(arg): v1 = arg.send() print(v1)

v1 = Email() func(v1)

v2 = Message() func(v2)

  1. - **面向对象的应用场景**
  2. 1. 将数据封装到一个对象,便于以后使用。(用户登录) <br />总结:数据封装到对象,以后再去获取。并且有规范数据(约束)的功能。注意:用字典也可以实现做封装,只不过字典在操作值时还需要自己写key,面向对象只需要 `.` 即可获取对象中封装的数据。
  3. ```python
  4. class UserInfo:
  5. def __init__(self, name, pwd,age):
  6. self.name = name
  7. self.password = pwd
  8. self.age = age
  9. def run():
  10. user_object_list = []
  11. # 用户注册
  12. while True:
  13. user = input("用户名:")
  14. if user.upper() == "Q":
  15. break
  16. pwd = input("密码")
  17. # user_object对象中有:name/password
  18. user_object = UserInfo(user, pwd,19)
  19. # user_dict = {"name":user,"password":pwd}
  20. user_object_list.append(user_object)
  21. # user_object_list.append(user_dict)
  22. # 展示用户信息
  23. for obj in user_object_list:
  24. print(obj.name, obj.password)
  1. 将数据分装到对象中,在方法中对原始数据进行加工处理。(分页功能)
    还有这个示例:将数据封装到一个对象中,然后再方法中对已封装的数据进行操作。
    ```python user_list = [“用户-{}”.format(i) for i in range(1,3000)]

分页显示,每页显示10条

while True: page = int(input(“请输入页码:”))

  1. start_index = (page - 1) * 10
  2. end_index = page * 10
  3. page_data_list = user_list[start_index:end_index]
  4. for item in page_data_list:
  5. print(item)
  1. ```python
  2. class Pagination:
  3. def __init__(self, current_page, per_page_num=10):
  4. self.per_page_num = per_page_num
  5. if not current_page.isdecimal():
  6. self.current_page = 1
  7. return
  8. current_page = int(current_page)
  9. if current_page < 1:
  10. self.current_page = 1
  11. return
  12. self.current_page = current_page
  13. def start(self):
  14. return (self.current_page - 1) * self.per_page_num
  15. def end(self):
  16. return self.current_page * self.per_page_num
  17. user_list = ["用户-{}".format(i) for i in range(1, 3000)]
  18. # 分页显示,每页显示10条
  19. while True:
  20. page = input("请输入页码:")
  21. # page,当前访问的页码
  22. # 10,每页显示10条数据
  23. # 内部执行Pagination类的init方法。
  24. pg_object = Pagination(page, 20)
  25. page_data_list = user_list[ pg_object.start() : pg_object.end() ]
  26. for item in page_data_list:
  27. print(item)
  1. import os
  2. import requests
  3. class DouYin:
  4. def __init__(self, folder_path):
  5. self.folder_path = folder_path
  6. if not os.path.exists(folder_path):
  7. os.makedirs(folder_path)
  8. def download(self, file_name, url):
  9. res = requests.get(
  10. url=url,
  11. headers={
  12. "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 FS"
  13. }
  14. )
  15. file_path = os.path.join(self.folder_path, file_name)
  16. with open(file_path, mode='wb') as f:
  17. f.write(res.content)
  18. f.flush()
  19. def multi_download(self, video_list):
  20. for item in video_list:
  21. self.download(item[0], item[1])
  22. if __name__ == '__main__':
  23. douyin_object = DouYin("videos")
  24. douyin_object.download(
  25. "罗斯.mp4",
  26. "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f240000buuer5aa4tij4gv6ajqg"
  27. )
  28. video_list = [
  29. ("a1.mp4", "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300fc20000bvi413nedtlt5abaa8tg"),
  30. ("a2.mp4", "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0d00fb60000bvi0ba63vni5gqts0uag"),
  31. ("a3.mp4", "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f240000buuer5aa4tij4gv6ajqg")
  32. ]
  33. douyin_object.multi_download(video_list)
  1. 根据类创建多个对象,在方法中对对象中的数据进行修改。(警察和恐怖分子)
    ```python class Police: “””警察”””

    def init(self, name, role): self.name = name self.role = role if role == “队员”:

    1. self.hit_points = 200

    else:

    1. self.hit_points = 500

    def show_status(self): “”” 查看警察状态 “”” message = “警察{}的生命值为:{}”.format(self.name, self.hit_points) print(message)

    def bomb(self, terrorist_list): “”” 投炸弹,炸掉恐怖分子 “”” for terrorist in terrorist_list:

    1. terrorist.blood -= 200
    2. terrorist.show_status()

“”” p1 = Police(“武沛齐”,”队员”) p1.show_status() p1.bomb([“alex”,”李杰”])

p2 = Police(“日天”,”队长”) p2.show_status() p2.bomb([“alex”,”李杰”]) “””

class Terrorist: “”” 恐怖分子 “””

  1. def __init__(self, name, blood=300):
  2. self.name = name
  3. self.blood = blood
  4. def shoot(self, police_object):
  5. """ 开枪射击某个警察 """
  6. police_object.hit_points -= 5
  7. police_object.show_status()
  8. self.blood -= 2
  9. def strafe(self, police_object_list):
  10. """ 扫射某些警察 """
  11. for police_object in police_object_list:
  12. police_object.hit_points -= 8
  13. police_object.show_status()
  14. def show_status(self):
  15. """ 查看恐怖分子状态 """
  16. message = "恐怖分子{}的血量值为:{}".format(self.name, self.blood)
  17. print(message)

“”” t1 = Terrorist(‘alex’) t2 = Terrorist(‘李杰’,200) “””

def run():

  1. # 1.创建3个警察
  2. p1 = Police("武沛齐", "队员")
  3. p2 = Police("苑昊", "队员")
  4. p3 = Police("于超", "队长")
  5. # 2.创建2个匪徒
  6. t1 = Terrorist("alex")
  7. t2 = Terrorist("eric")
  8. # alex匪徒射击于超警察
  9. t1.shoot(p3)
  10. # alex扫射
  11. t1.strafe([p1, p2, p3])
  12. # eric射击苑昊
  13. t2.shoot(p2)
  14. # 武沛齐炸了那群匪徒王八蛋
  15. p1.bomb([t1, t2])
  16. # 武沛齐又炸了一次alex
  17. p1.bomb([t1])

if name == ‘main‘: run()

  1. - 补充:在Python3中编写类时,**默认都会继承object**(即使不写也会自动继承)。这一点在Python2是不同的:继承object,就是新式类,不继承object,经典类。
  2. ```python
  3. class Foo:
  4. pass
  5. class Foo(object):
  6. pass

作业

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

  • 封装,将方法封装到类中 或 将数据封装到对象中,便于以后使用。
  • 继承,将类中的公共的方法提取到基类中去实现。
  • 多态,Python默认支持多态(这种方式称之为鸭子类型)

2、将以下函数改成类的方式并调用

  1. def func(a1):
  2. print(a1)
  • 答:
    1. class Foo():
    2. def func(self, a1):
    3. print(a1)
    4. obj = Foo()
    5. obj.func("武沛齐")

3、面向对象中的self指的是什么?

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

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

  1. class Person(object):
  2. def __init__(self, name, age, gender):
  3. self.name = name
  4. self.age = age
  5. self.gender = gender
  6. obj = Person('武沛齐', 18, '男')
  • 答:
    封装

5、以下代码体现面向对象的什么特点?

  1. class Message(object):
  2. def email(self):
  3. """
  4. 发送邮件
  5. :return:
  6. """
  7. pass
  8. def msg(self):
  9. """
  10. 发送短信
  11. :return:
  12. """
  13. pass
  14. def wechat(self):
  15. """
  16. 发送微信
  17. :return:
  18. """
  19. pass
  • 答:
    封装

6、看代码写结果

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

  • foo.func
    None

7、看代码写结果

  1. class Base1:
  2. def f1(self):
  3. print('base1.f1')
  4. def f2(self):
  5. print('base1.f2')
  6. def f3(self):
  7. print('base1.f3')
  8. self.f1()
  9. class Base2:
  10. def f1(self):
  11. print('base2.f1')
  12. class Foo(Base1, Base2):
  13. def f0(self):
  14. print('foo.f0')
  15. self.f3()
  16. obj = Foo()
  17. obj.f0()

  • foo.f0
    base1.f3
    base1.f1

8、看代码写结果:

  1. class Base:
  2. def f1(self):
  3. print('base.f1')
  4. def f3(self):
  5. self.f1()
  6. print('base.f3')
  7. class Foo(Base):
  8. def f1(self):
  9. print('foo.f1')
  10. def f2(self):
  11. print('foo.f2')
  12. self.f3()
  13. obj = Foo()
  14. obj.f2()
  • 答:
    foo.f2
    base.f1 foo.f1 (还是先从obj对象即foo类开始找f1)
    base.f3

9、补充代码实现

  1. user_list = []
  2. while True:
  3. user = input("请输入用户名:")
  4. pwd = input("请输入密码:")
  5. email = input("请输入邮箱:")
  6. """
  7. # 需求
  8. 1. while循环提示用户输入: 用户名、密码、邮箱(正则满足邮箱格式)
  9. 2. 为每个用户创建一个个对象,并添加到user_list中。
  10. 3. 当列表中的添加 3个对象后,跳出循环并以此循环打印所有用户的姓名和邮箱
  11. """

  • ```python 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

  1. user_object = UserInfo(user, pwd, email)
  2. user_list.append(user_object)
  3. if len(user_list) == 3:
  4. break
  5. for item in user_list:
  6. print(item.name, item.email)

if name == ‘main‘: main()

  1. <a name="reYs0"></a>
  2. ### 10、补充代码:实现用户注册和登录。
  3. ```python
  4. class User:
  5. def __init__(self, name, pwd):
  6. self.name = name
  7. self.pwd = pwd
  8. class Account:
  9. def __init__(self):
  10. # 用户列表,数据格式:[user对象,user对象,user对象]
  11. self.user_list = []
  12. def login(self):
  13. """
  14. 用户登录,输入用户名和密码然后去self.user_list中校验用户合法性
  15. :return:
  16. """
  17. pass
  18. def register(self):
  19. """
  20. 用户注册,每注册一个用户就创建一个user对象,然后添加到self.user_list中,表示注册成功。
  21. :return:
  22. """
  23. pass
  24. def run(self):
  25. """
  26. 主程序
  27. :return:
  28. """
  29. pass
  30. if __name__ == '__main__':
  31. obj = Account()
  32. obj.run()

答:

  1. class User:
  2. def __init__(self, name, pwd):
  3. self.name = name
  4. self.pwd = pwd
  5. class Account:
  6. def __init__(self):
  7. # 用户列表,数据格式:[user对象,user对象,user对象]
  8. self.user_list = []
  9. def login(self):
  10. """
  11. 用户登录,输入用户名和密码然后去self.user_list中校验用户合法性
  12. :return:
  13. """
  14. print("用户登录")
  15. while True:
  16. user = input("请输入用户名(Q/q):")
  17. if user.upper() == 'Q':
  18. break
  19. pwd = input("请输入密码:")
  20. for user_object in self.user_list:
  21. if user == user_object.name and pwd == user_object.pwd:
  22. print("登录成功")
  23. break
  24. else:
  25. print("登录失败")
  26. def register(self):
  27. """
  28. 用户注册,每注册一个用户就创建一个user对象,然后添加到self.user_list中,表示注册成功。
  29. :return:
  30. """
  31. print("用户注册")
  32. while True:
  33. user = input("请输入用户名(Q/q):")
  34. if user.upper() == 'Q':
  35. break
  36. pwd = input("请输入密码:")
  37. user_object = User(user, pwd)
  38. self.user_list.append(user_object)
  39. def run(self):
  40. """
  41. 主程序
  42. :return:
  43. """
  44. method_dict = {
  45. "1": {"title": "登录", "method": self.login},
  46. "2": {"title": "注册", "method": self.register},
  47. }
  48. message = ";".join(["{}.{}".format(k, v['title']) for k, v in method_dict.items()])
  49. while True:
  50. print(message)
  51. choice = input("请选择功能(Q/q):")
  52. if choice.upper() == 'Q':
  53. break
  54. info = method_dict.get(choice)
  55. if not info:
  56. print("选择错误,请重新选择")
  57. continue
  58. method = info['method']
  59. method() # self.login() / self.register()
  60. if __name__ == '__main__':
  61. obj = Account()
  62. obj.run()