Files
python-book/02.面向对象/01.初识面向对象.md
2025-09-15 11:25:51 +08:00

311 lines
6.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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