面向对象
面向过程编程 vs 函数式编程
# 面向过程编程s1 = 'fjdsklafsjda'count = 0for i in s1:count += 1l1 = [1,2,3,4]count = 0for i in l1:count += 1
Python
Copy
# 函数式编程def func(s):count = 0for i in s:count += 1return countfunc('fdsafdsa')func([1,2,3,4])
Python
Copy
通过对比可知:函数编程较之面向过程编程最明显的两个特点:
- 减少代码的重用性。
- 增强代码的可读性。
函数式编程 vs 面向对象编程
# 函数式编程# auth 认证相关def login():passdef regisgter():pass# account 账户相关def func1():passdef func2():pass# 购物车相关def shopping(username,money):passdef check_paidgoods(username,money):passdef check_unpaidgoods(username,money):passdef save(username,money):pass
Python
Copy
class LoginHandler:def login(self):passdef regisgter(self):passclass Account:def func1(self):passdef func2(self):passclass ShoppingCar:def shopping(username,money):passdef check_paidgoods(username,money):passdef check_unpaidgoods(username,money):passdef save(username,money):pass
Python
Copy
- 面向对象编程:是一类相似功能函数的集合, 使你的代码更清晰化,更合理化。
- 面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板(厂房),对象就从具体的模板实例化出来。
类的结构
class Human:"""此类主要是构建人类"""mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段dic = {}l1 = []def work(self): # 第二部分:方法 函数 动态属性print('人类会工作')
Python
Copy
class 是关键字与 def 用法相同,定义一个类。
Human 是此类的类名,类名使用驼峰 (CamelCase) 命名风格,首字母大写,私有类可用一个下划线开头。
类的结构从大方向来说就分为两部分:
- 静态变量
- 动态方法
从类名的角度研究类
类名操作静态属性
查看类中的所有内容:类名.dict方式。
class Human:mind = '有思想'dic = {}l1 = []def work(self):print('会工作')print(Human.__dict__)print(Human.__dict__['mind'])Human.__dict__['mind'] = '高智慧'print(Human.__dict__)# 通过这种方式只能查询,不能增删改
Python
Copy
万能的点.
class Human:mind = '有思想'dic = {}l1 = []def work(self):print('会工作')print(Human.mind)Human.mind = '高智慧'print(Human.mind)del Human.mindHuman.walk = '用脚走'print(Human.walk)# 通过万能的点 可以增删改查类中的单个属性
Python
Copy
对以上两种做一个总结:如果想查询类中的所有内容,通过 第一种 dict 方法,如果只是操作单个属性则用万能的点的方式。
类名操作动态方法
class Human:mind = '有思想'dic = {}l1 = []def work(self):print(self,'会工作')Human.work('chensong')Human.__dict__['work']('chensong')
Python
Copy
从对象的角度研究类
对象
对象是从类中出来的,只要是 类名加上(),这就是一个实例化过程,这个就会实例化一个对象。
class Human:mind = '有思想'dic = {}l1 = []def work(self):print(self,'会工作')obj = Human()# 只要实例化对象,它会自动执行__init__方法print(obj)
Python
Copy
其实实例化一个对象总共发生了三件事:
- 在内存中开辟了一个对象空间。
- 自动执行类中的 init 方法,并将这个对象空间(内存地址)传给了 init 方法的第一个位置参数 self。
- 在init 方法中通过 self 给对象空间添加属性。
Pythonclass Human:mind = '有思想'work = '用两只腿走'def __init__(self,name,sex,age,hobby):self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('chensong','男','18','男')
Copy
对象操作对象空间属性
对象查询对象中所有属性。对象.__dict__
Pythonclass Human:mind = '有思想'language = '实用语言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('chensong','男',18,'男')print(obj.__dict__)
Copy
对象操作对象中的单个属性。 万能的点.
Pythonclass Human:mind = '有思想'language = '实用语言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('chensong','男',18,'男')obj.job = 'IT'del obj.nobj.s = '女'print(obj.s)print(obj.__dict__)
Copy
对象查看类中的属性
Pythonclass Human:mind = '有思想'language = '实用语言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('chensong','男',18,'男')print(obj.mind)print(obj.language)obj.a = 666print(obj.a)
Copy
对象操作类中的方法
Pythonclass Human:mind = '有思想'language = '实用语言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。self.n = nameself.s = sexself.a = ageself.h = hobbydef work(self):print(self)print(self.n,'会工作')def tools(self):print(self.n,'会使用工具')obj = Human('chensong','男',18,'男')obj.work()obj.tools()
Copy
类中的方法一般都是通过对象执行的(出去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数 self.
self 其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动将调用这个函数的对象传给 self。所以咱们把类中的方法的第一个参数约定俗成设置成 self, 代表这个就是对象。
一个类可以实例化多个对象
