面向对象

面向过程编程 vs 函数式编程

  1. # 面向过程编程
  2. s1 = 'fjdsklafsjda'
  3. count = 0
  4. for i in s1:
  5. count += 1
  6. l1 = [1,2,3,4]
  7. count = 0
  8. for i in l1:
  9. count += 1

Python
Copy

  1. # 函数式编程
  2. def func(s):
  3. count = 0
  4. for i in s:
  5. count += 1
  6. return count
  7. func('fdsafdsa')
  8. func([1,2,3,4])

Python
Copy
通过对比可知:函数编程较之面向过程编程最明显的两个特点:

  1. 减少代码的重用性。
  2. 增强代码的可读性。

函数式编程 vs 面向对象编程

  1. # 函数式编程
  2. # auth 认证相关
  3. def login():
  4. pass
  5. def regisgter():
  6. pass
  7. # account 账户相关
  8. def func1():
  9. pass
  10. def func2():
  11. pass
  12. # 购物车相关
  13. def shopping(username,money):
  14. pass
  15. def check_paidgoods(username,money):
  16. pass
  17. def check_unpaidgoods(username,money):
  18. pass
  19. def save(username,money):
  20. pass

Python
Copy

  1. class LoginHandler:
  2. def login(self):
  3. pass
  4. def regisgter(self):
  5. pass
  6. class Account:
  7. def func1(self):
  8. pass
  9. def func2(self):
  10. pass
  11. class ShoppingCar:
  12. def shopping(username,money):
  13. pass
  14. def check_paidgoods(username,money):
  15. pass
  16. def check_unpaidgoods(username,money):
  17. pass
  18. def save(username,money):
  19. pass

Python
Copy

  1. 面向对象编程:是一类相似功能函数的集合, 使你的代码更清晰化,更合理化。
  2. 面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板(厂房),对象就从具体的模板实例化出来。

类的结构

  1. class Human:
  2. """
  3. 此类主要是构建人类
  4. """
  5. mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段
  6. dic = {}
  7. l1 = []
  8. def work(self): # 第二部分:方法 函数 动态属性
  9. print('人类会工作')

Python
Copy
class 是关键字与 def 用法相同,定义一个类。
Human 是此类的类名,类名使用驼峰 (CamelCase) 命名风格,首字母大写,私有类可用一个下划线开头。
类的结构从大方向来说就分为两部分:

  • 静态变量
  • 动态方法

从类名的角度研究类

类名操作静态属性

查看类中的所有内容:类名.dict方式。

  1. class Human:
  2. mind = '有思想'
  3. dic = {}
  4. l1 = []
  5. def work(self):
  6. print('会工作')
  7. print(Human.__dict__)
  8. print(Human.__dict__['mind'])
  9. Human.__dict__['mind'] = '高智慧'
  10. print(Human.__dict__)
  11. # 通过这种方式只能查询,不能增删改

Python
Copy
万能的点.

  1. class Human:
  2. mind = '有思想'
  3. dic = {}
  4. l1 = []
  5. def work(self):
  6. print('会工作')
  7. print(Human.mind)
  8. Human.mind = '高智慧'
  9. print(Human.mind)
  10. del Human.mind
  11. Human.walk = '用脚走'
  12. print(Human.walk)
  13. # 通过万能的点 可以增删改查类中的单个属性

Python
Copy
对以上两种做一个总结:如果想查询类中的所有内容,通过 第一种 dict 方法,如果只是操作单个属性则用万能的点的方式。

类名操作动态方法

  1. class Human:
  2. mind = '有思想'
  3. dic = {}
  4. l1 = []
  5. def work(self):
  6. print(self,'会工作')
  7. Human.work('chensong')
  8. Human.__dict__['work']('chensong')

Python
Copy

从对象的角度研究类

对象

对象是从类中出来的,只要是 类名加上(),这就是一个实例化过程,这个就会实例化一个对象。

  1. class Human:
  2. mind = '有思想'
  3. dic = {}
  4. l1 = []
  5. def work(self):
  6. print(self,'会工作')
  7. obj = Human()
  8. # 只要实例化对象,它会自动执行__init__方法
  9. print(obj)

Python
Copy
其实实例化一个对象总共发生了三件事:

  1. 在内存中开辟了一个对象空间。
  2. 自动执行类中的 init 方法,并将这个对象空间(内存地址)传给了 init 方法的第一个位置参数 self。
  3. init 方法中通过 self 给对象空间添加属性。
    1. class Human:
    2. mind = '有思想'
    3. work = '用两只腿走'
    4. def __init__(self,name,sex,age,hobby):
    5. self.n = name
    6. self.s = sex
    7. self.a = age
    8. self.h = hobby
    9. obj = Human('chensong','男''18','男')
    Python
    Copy

    对象操作对象空间属性

    对象查询对象中所有属性。 对象.__dict__
    1. class Human:
    2. mind = '有思想'
    3. language = '实用语言'
    4. def __init__(self,name,sex,age,hobby):
    5. # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
    6. self.n = name
    7. self.s = sex
    8. self.a = age
    9. self.h = hobby
    10. obj = Human('chensong','男',18,'男')
    11. print(obj.__dict__)
    Python
    Copy
    对象操作对象中的单个属性。 万能的点.
    1. class Human:
    2. mind = '有思想'
    3. language = '实用语言'
    4. def __init__(self,name,sex,age,hobby):
    5. # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
    6. self.n = name
    7. self.s = sex
    8. self.a = age
    9. self.h = hobby
    10. obj = Human('chensong','男',18,'男')
    11. obj.job = 'IT'
    12. del obj.n
    13. obj.s = '女'
    14. print(obj.s)
    15. print(obj.__dict__)
    Python
    Copy

    对象查看类中的属性

    1. class Human:
    2. mind = '有思想'
    3. language = '实用语言'
    4. def __init__(self,name,sex,age,hobby):
    5. # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
    6. self.n = name
    7. self.s = sex
    8. self.a = age
    9. self.h = hobby
    10. obj = Human('chensong','男',18,'男')
    11. print(obj.mind)
    12. print(obj.language)
    13. obj.a = 666
    14. print(obj.a)
    Python
    Copy

    对象操作类中的方法

    1. class Human:
    2. mind = '有思想'
    3. language = '实用语言'
    4. def __init__(self,name,sex,age,hobby):
    5. # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
    6. self.n = name
    7. self.s = sex
    8. self.a = age
    9. self.h = hobby
    10. def work(self):
    11. print(self)
    12. print(self.n,'会工作')
    13. def tools(self):
    14. print(self.n,'会使用工具')
    15. obj = Human('chensong','男',18,'男')
    16. obj.work()
    17. obj.tools()
    Python
    Copy
    类中的方法一般都是通过对象执行的(出去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数 self.
    self 其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动将调用这个函数的对象传给 self。所以咱们把类中的方法的第一个参数约定俗成设置成 self, 代表这个就是对象。
    一个类可以实例化多个对象