# 初识面向对象

## 面向对象

### 面向过程编程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('chensong')
Human.__dict__['work']('chensong')
```

## 从对象的角度研究类

### 对象

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

```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('chensong','男'，'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('chensong','男',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('chensong','男',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('chensong','男',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('chensong','男',18,'男')
obj.work()
obj.tools()
```

**类中的方法一般都是通过对象执行的（出去类方法，静态方法外），并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self.**

*self其实就是类中方法（函数）的第一个位置参数，只不过解释器会自动将调用这个函数的对象传给self。所以咱们把类中的方法的第一个参数约定俗成设置成self, 代表这个就是对象。*

**一个类可以实例化多个对象**

