面向对象编程
1.面向对象初步了解
面向过程编程与函数编程对比:
s1 = 'ajdsgkaffddha'
count = 0
for i in s1:count += 1
print(f'字符串的长度为{count}') # 面向过程编程每计算一次便使用一次for循环def my_len(s): # 计算数据类型长度的函数,可重复使用count = 0for i in s:count += 1return count
print(my_len(s1))
通过对比可知:函数编程较之面向过程编程最明显的两个特点:
1,减少代码的重用性。
2,增强代码的可读性。
同样,函数编程与面向对象变成的对比:
# 函数编程
auth # 认证相关
def register():pass
def login():pass# 账户相关
def func1():pass
def func2():pass# 购物车相关
def shopping_car():pass
def check_paid_goods():pass
def check_unpaid_goods():pass
def save():pass# 面向对象编程
class Auth:def register():passdef login():passclass Account:def func1():passdef func2():passclass Shopping:def shopping_car():passdef check_paid_goods():passdef check_unpaid_goods():passdef save():pass
通过对比可以看出面向对象第一个优点:
面向对象编程:是一类相似功能函数的集合,使你的代码更清晰化,更合理化。
说第二个优点之前,先看看什么是面向对象。
面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。
那什么是类?什么是对象?
类:就是具有相同属性和功能的一类事物。
对象:就是类的具体表现。
简而言之:类就像制造一类事物的模板,而对象则是制造出来的一个个具体化的实例
2.面向的对象的结构
class Human:mind = "有思想"language = "使用语言"l1 = [] # 静态变量def work(self):print("人类会工作")def eat(self):print("人类都需要吃饭") # 动态方法# class 关键字,定义一个类
# Human 类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。
# 类的结构从大方向来说就分为两部分:
# 静态变量。
# 动态方法。
3.从类名的角度研究类
- 类名操作类的属性
第一种,查看类中的所有内容:类名.__dict__方式。
class Human:mind = "有思想"language = "使用语言"l1 = [] # 静态变量def work(self):print("人类会工作")def eat(self):print("人类都需要吃饭") # 动态方法
print(Human.__dict__) # 查看类中所有的内容
print(Human.__dict__["mind"]) # 查看类中mind属性的内容
Human.__dict__['mind'] = '无脑'
print(Human.__dict__) # 这种做法是错误的,__dict__无法修改类中的内容
第二种:万能的点.
class Human:mind = "有思想" # 第一部分:静态属性 属性 静态变量 静态字段dic = {}l1 = []def work(self):print(self)print("人类都会工作") # 第二部分:方法 函数 动态属性
print(Human.mind) # 查
Human.mind = "无脑" # 改
print(Human.mind)
del Human.mind # 删
Human.walk = "直立行走"
print(Human.walk)
# 通过万能的. 可以增删查改类中的单个属性
**总结:如果想查询类中的所有内容,通过 第一种__dict__方法,如果只是操作单个属性则用万能的点的方式。**
- 类名调用类的方法
前提:除了两个特殊方法:静态方法,类方法之外,一般不会通过类名操作一个类中的方法。
class Human:mind = "有思想"dic = {}l1 = []def work(self):print(self)print("人类会工作")def tools(self):print("人类会使用工具")
Human.work(111)
Human.tools(111)
Human.__dict__["work"](111)
# 结果:
111
人类会工作
人类会使用工具
111
人类会工作
4.从对象的角度研究类
- 什么是对象
对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象。
class Human:mind = "有思想"def __init__(self):print(666)print(self) # <__main__.Human object at 0x00000196E0DA8CF8>def work(self):print("人类会使用工具")
obj = Human() # 只要实例化对象,它会在自动执行__init__方法
print(obj) # <__main__.Human object at 0x00000196E0DA8CF8>
# 结果:# obj地址与self的地址相同
666
<__main__.Human object at 0x00000196E0DA8CF8>
<__main__.Human object at 0x00000196E0DA8CF8>
- 实例化对象发生了三件事
其实实例化一个对象总共发生了三件事:
1.在内存中开辟了一个对象空间。
2.自动执行类中的__init__方法,并将这个对象空间(内存地址)传给了__init__方法的第一个位置参数self。
3.在__init__ 方法中通过self给对象空间添加属性。
class Human:mind = "有思想"language = "使用语言"def __init__(self,name,sex,age,hobby):# self和obj两个变量指向同一个内存地址,下面就是通过self给这个对象空间封装四个属性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human("barry","男",18,"运动")
- 对象操作对象属性
class Human:mind = "有思想"language = "使用语言"def __init__(self,name,sex,age,hobby):# self和obj两个变量指向同一个内存地址,下面就是通过self给这个对象空间封装四个属性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human("barry","男",18,"运动")
obj.job = 'IT' # 增
del obj.n # 删
obj.s = '女' # 改
print(obj.s) # 查
print(obj.__dict__)
# 结果:
女
{'s': '女', 'a': 18, 'h': '运动', 'job': 'IT'}
- 对象查看类中的属性
class Human:mind = "有思想"language = "使用语言"def __init__(self,name,sex,age,hobby):self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human("barry","男",18,"运动")
print(obj.mind)
print(obj.language)
obj.a = 666
print(obj.a)
# 结果:
有思想
使用语言
666
- 对象调用类中的方法
class Human:mind = "有思想"language = "使用语言"def __init__(self,name,sex,age,hobby):self.n = nameself.s = sexself.a = ageself.h = hobbydef work(self):print(self)print("人类会工作")def tools(self):print("人类会使用工具")
obj = Human("barry","男",18,"运动")
obj.work()
obj.tools()
# 结果:
<__main__.Human object at 0x000001D2414DF7F0> # 实例化对象内存地址
人类会工作
人类会使用工具
类中的方法一般都是通过对象执行的(出去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self.
5.self是什么?
self其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动将调用这个函数的对象传给self。所以咱们把类中的方法的第一个参数约定俗成设置成self, 代表这个就是对象。
6.一个类可以实例化多个对象
class Human:mind = "有思想"language = "使用语言"def __init__(self,name,sex,age,hobby):self.n = nameself.s = sexself.a = ageself.h = hobbydef work(self):print(self)print("人类会工作")def tools(self):print("人类会使用工具")
obj1= Human('小胖','男',20,'美女')
obj2= Human('相爷','男',18,'肥女')
print(obj1,obj2)
print(obj1.__dict__)
print(obj2.__dict__)
# 结果:
<__main__.Human object at 0x000001C96A1FF860> <__main__.Human object at 0x000001C96A1FF898>
{'n': '小胖', 's': '男', 'a': 20, 'h': '美女'}
{'n': '相爷', 's': '男', 'a': 18, 'h': '肥女'}