写点什么

趁着课余时间学点 Python(十一)面向对象的理解(高潮)

用户头像
ベ布小禅
关注
发布于: 30 分钟前
趁着课余时间学点Python(十一)面向对象的理解(高潮)

![](https://img-blog.csdnimg.cn/img_convert/079dd408b9d8489fd6080eff2e9a5cbd.png)


# 前言


上篇面向对象貌似反响不错啊,好多人都挺期待下一篇的,但是呢由于马上就要期末考试了,正在抓紧时间复习,所以这一篇就拖了很久,抱歉啦~


那么今天讲什么内容呢?


构造方法,继承,封装


本篇友情客串:


[萌杰尔](https://blog.csdn.net/mengerzhang) —— 一个底层的高手


[丸子](https://blog.csdn.net/m0_56931236) —— 一个憨憨


# 构造方法


构造方法是什么呢?


类里面定义的函数叫做类的方法,变量叫做类的属性


## 作用


1. 构造方法是类的默认函数,也就是说,不管你的代码有没有写这个方法,类里面,总会有这个东西。


而这个构造方法的名字叫做是`__init__`


```python

class Person(object):

pass

丸子 = Person()

a = person.__init__()

print(a)

```


输出的结果会是 None,也就是空值,为什么呢?因为这是个函数,他默认没有返回值,也就是乜有 return 语句,所以输出这个构造方法(函数),就是 None 了


当然了,不止这个作用


2. 构造方法还是对类传参的方法


之前不是讲过函数的传参吗,类也能传参,就靠这个构造方法来传递了


```python

class Person(object):

def __init__(self, name, age):

self.name = name

self.age = age

Menger = Person()

print(person.__init__())

```


这样是会报错的!因为你的构造方法有参数,而你实例化对象没有参数,所以会报错


会报什么错呢?他会告诉你,你的类应该有两个参数,而你一个都没有给,还少了两个。


` person = Person()

TypeError: __init__() missing 2 required positional arguments: 'name' and 'age'`


而这样就对了:


```python

class Person(object):

def __init__(self, name, age):

self.name = name

self.age = age

Menger = Person("萌杰尔", 20)

```


这样计算机就知道了你这个 person 的对象的 name 和 age 属性的值


而你也可以通过


`Menger.name`和`Menger.age`来查看对象的属性


```python

name = Menger.name

age = Menger.age

print("姓名:{} \n 年龄:{}".format(name, age))

```


结果是:


`姓名:萌杰尔

年龄:20`


3. 还有一个作用是将属性私有化,也就是封装


可以将构造方法的参数,进行封装,让其在每个方法中都可以调用


想着这样的代码就是错的


```python

class Person(object):

def __init__(self, name, age):

pass

def speak(self):

print(f"{age}岁的{name}会说话")

Menger = Person("布小禅", 20)

name = Menger.name

age = Menger.age

person.speak()

print("姓名:{} \n 年龄:{}".format(name, age))

```


因为 speak 方法里面的 name 和 age,计算机不知道是谁,计算机不认识他们两个,而刚刚那两行`self.name = name`和`self.age = age`就是相当于告诉计算机 name 和 age 是类的参数


```python

class Person(object):

def __init__(self, name, age):

self.name = name

self.age = age

def speak(self):

print(f"{age}岁的{name}会说话")

Menger = Person("布小禅", 20)

name = Menger.name

age = Menger.age

Menger.speak()

print("姓名:{} \n 年龄:{}".format(name, age))

```


这样就对了,输出为:


20 岁的萌杰尔会说话

姓名:萌杰尔

年龄:20


## 扩展


像`__init__`这样的被四个`_`围着的方法叫做魔术方法,是 object 类的自带方法因此自己定义的方法一般不推荐使用这样的命名方式


# 继承


Python 的面向对象是可以继承的,就像你继承了你爸爸和你妈妈的部分特征,Python 中的子类,继承父类,说起继承,其实你们也都见过了,就我上一篇说的三种定义类的方法的第三种:


```python

class ClassNmae(object):

代码块

```


那个`ClassNmae`后面的括号里的`object`就是父类,而`ClassName`是子类


子类继承父类的所有东西


## 作用


和函数,类的作用有向通之处,都可以降低代码的重用率,也就是少写点代码


比如你在开发中需要新建一个类,而这个类刚好可以使用你写过的某个类的方法,这时候你只需要将新建类继承一下你写过的那个类就可以做到了,而不用再去写一个方法了


## 使用


我们先构建一个人类,人类有姓名,名字,人会说话


```python

class Person(object):


def __init__(self, name, age):

self.name = name

self.age = age

def speak(self):

print(f"{self.age}岁的{self.name}会说话")

```


然后我们再构建一个男孩类,继承人类


```python

class Boy(Person):

pass

```


上面我们说过,子类继承父类所有的东西


那么说明我们可以这样


```python

boy = Boy ("Menger", 20)

boy.speak()

```


输出:**20 岁的 Menger 会说话**


很明显,我们的男孩类里面有`name`和`age`属性,也有 speak 方法


## 多继承


顾名思义,就是一个子类可以继承多个父类


格式:


```python

class ClassName(Class1, Class2, Class3):

pass

```


# 封装


其实我们写的就是封装了


就是`__init__`方法中的`self.name`和`self.age`


将数据在类内部调用,使其在类外部使用


当然这种方法安全性并不如何高


下篇会讲解


## 封装属性


在构造方法里面进行


```python

class Person(object):

def __init__(self, name, age):

self.name = name

self.age = age

```


然后通过`self.name`在别的方法里面调用属性


弊端:


在类外部也可以通过`实例化对象.属性名`来修改


# 结语


下篇预告:私有属性,私有方法,多态


兴趣是最好的老师,坚持是不变的真理。

学习不要急躁,一步一个脚印,踏踏实实的往前走。

每天进步一点点,日积月累之下,你就会发现自己已经变得很厉害了。


我是布小禅,一枚自学萌新,跟着我每天进步一点点吧!


说了这么多暂时也就够了,那么就告辞吧


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210519235822187.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUyODgzODk4,size_16,color_FFFFFF,t_70)

发布于: 30 分钟前阅读数: 4
用户头像

ベ布小禅

关注

还未添加个人签名 2021.04.06 加入

平平无奇一萌新,默默无闻学IT,我是布小禅,一个网络专业却对编程及其感兴趣的小白! 目前在学python和Java,都很浅显,平时爱写点学习笔记。IT技术交流群:1039347613 也可以联系本人企鹅:2228660752 v:Smly0413

评论

发布
暂无评论
趁着课余时间学点Python(十一)面向对象的理解(高潮)