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

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


image.png

文章目录


前言

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

那么今天讲什么内容呢?

构造方法,继承,封装

本篇友情客串:

萌杰尔 —— 一个底层的高手

丸子 —— 一个憨憨


构造方法

构造方法是什么呢?

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


作用

  1. 构造方法是类的默认函数,也就是说,不管你的代码有没有写这个方法,类里面,总会有这个东西。
    而这个构造方法的名字叫做是__init__
class Person(object):
    pass
丸子 = Person()
a = person.__init__()
print(a)
  1. 输出的结果会是None,也就是空值,为什么呢?因为这是个函数,他默认没有返回值,也就是乜有return语句,所以输出这个构造方法(函数),就是None了
    当然了,不止这个作用
  2. 构造方法还是对类传参的方法
    之前不是讲过函数的传参吗,类也能传参,就靠这个构造方法来传递了
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
Menger = Person()
print(person.__init__())
  1. 这样是会报错的!因为你的构造方法有参数,而你实例化对象没有参数,所以会报错
    会报什么错呢?他会告诉你,你的类应该有两个参数,而你一个都没有给,还少了两个。
    person = Person() TypeError: __init__() missing 2 required positional arguments: 'name' and 'age'
    而这样就对了:
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
Menger = Person("萌杰尔", 20)
  1. 这样计算机就知道了你这个person的对象的name和age属性的值
    而你也可以通过
    Menger.nameMenger.age来查看对象的属性
name = Menger.name
age = Menger.age
print("姓名:{} \n年龄:{}".format(name, age))
  1. 结果是:
    姓名:萌杰尔 年龄:20
  2. 还有一个作用是将属性私有化,也就是封装
    可以将构造方法的参数,进行封装,让其在每个方法中都可以调用
    想着这样的代码就是错的
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))
  1. 因为speak方法里面的name和age,计算机不知道是谁,计算机不认识他们两个,而刚刚那两行self.name = nameself.age = age就是相当于告诉计算机name和age是类的参数
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))
  1. 这样就对了,输出为:
    20岁的萌杰尔会说话
    姓名:萌杰尔
    年龄:20


扩展

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


继承

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

class ClassNmae(object):
    代码块

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

子类继承父类的所有东西


作用

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

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


使用

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

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def speak(self):
        print(f"{self.age}岁的{self.name}会说话")

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

class Boy(Person):
    pass

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

那么说明我们可以这样

boy = Boy ("Menger", 20)
boy.speak()

输出:20岁的Menger会说话

很明显,我们的男孩类里面有nameage属性,也有speak方法


多继承

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

格式:

class ClassName(Class1, Class2, Class3):
    pass


封装

其实我们写的就是封装了

就是__init__方法中的self.nameself.age

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

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

下篇会讲解


封装属性

在构造方法里面进行

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

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

弊端:

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


结语

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

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

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

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

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

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

image.png


目录
相关文章
|
1月前
|
Java 程序员 C++
Python 面向对象详解!
本文详细介绍了Python中的面向对象编程(OOP),包括类、对象、继承、封装、多态和抽象等核心概念。通过具体示例,解释了如何使用类定义对象的属性和方法,以及如何通过继承实现代码重用。文章还探讨了封装和多态的重要性,并介绍了私有属性和抽象类的使用方法。最后,总结了OOP的四大支柱:封装、抽象、继承和多态,强调了这些概念在Python编程中的应用。适合Java程序员扩展Python编程知识。
66 2
|
24天前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
Python面向对象(2)
|
3月前
|
Python
你真的会面向对象吗!解密Python“魔术方法”
你真的会面向对象吗!解密Python“魔术方法”
38 0
|
25天前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
Python面向对象
|
5月前
|
Python
Python进阶第一篇(Python的面向对象)
Python进阶第一篇(Python的面向对象)
|
6月前
|
存储 算法 安全
Python编程实验六:面向对象应用
Python编程实验六:面向对象应用
104 1
|
2月前
|
前端开发 Python
Python编程的面向对象有哪些(二)
Python编程的面向对象(二)—类的多态
|
2月前
|
IDE Java 开发工具
Python类与面向对象
Python类与面向对象
|
1月前
|
Python
Python编程-关于面向对象的一些
Python编程-关于面向对象的一些
|
6月前
|
人工智能 自然语言处理 开发者
Python基础教程——面向对象
Python基础教程——面向对象