1Python全栈之路系列之面向基础

Python全栈之路系列之面向对象基础

面向对象基本介绍

Python编程方式:

  1. 面向过程编程
  2. 面向函数编程
  3. 面向对象编程

名称定义:

  1. 如果函数没有在类中称之为函数
  2. 如果函数在类中称之为方法


创建类

# 创建一个类,类名是Class_basis
class Class_basis:
    # 在类里面创建了一个方法ret,类里面的方法必须加一个self关键字
    def ret(self):
        # 当调用方法的时候输出ret
        print("ret")

使用类

# 通过Class_basis类创建一个对象obj(创建一个Class_basis实例),类名后面加括号
obj = Class_basis()

# 通过对象调用类中的ret方法
obj.ret()

类的内存地址对应关系

面向对象之self

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

# 创建一个类,类名是Class_basis
class Class_basis:
    # 在类里面创建了一个方法ret
    def ret(self,):
        # 输出self的内存地址
        print("方法ret的self内存地址", id(self))
# 创建一个对象obj,类名后面加括号
obj = Class_basis()

# 输出对象obj的内存地址
print("obj对象内存地址", id(obj))

# 通过对象调用类中的ret方法
obj.ret()

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py
obj对象内存地址 2420760156536
方法ret的self内存地址 2420760156536

Process finished with exit code 0

通过上面的测试可以很清楚的看到obj对象和类的方法中self内存地址是一样的,那么方法中的self就等于obj

如图

self是形式参数,有Python自行传递。

面向对象之封装

封装就是将内容封装到某个地方,以后再去调用被封装在某处的内容,在使用面向对象的封装特性时,需要:

  1. 将内容封装到某处
  2. 从某处调用被封装的内容
class Foo:
    def ret(self):
        # 输出backend变量的内容
        print(self.backend)
        
obj = Foo()
# 在对象中创建一个backend变量
obj.backend = "as"
obj.ret()

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py
as

Process finished with exit code 0

上面的封装是一种非主流的封装方式,下面的__init__构造方法封装方式是主流的封装方式。

class Foo:
    # 进入类的时候首先执行__init__方法
    def __init__(self, name):
    
        """
        __init__称之为构造方法
        :param name: Foo传递过来的参数
        """
        
        # 在类中创建一个成员Name,它的值是传过来的形参name
        self.Name = name
    # 类的方法
    def user(self):
        # 输出Name的值
        print(self.Name)
        
# 创建对象,并且将"Ansheng"封装到对象中,类+括号的时候会自动执行__init__方法
obj = Foo("Ansheng")

# 执行user方法
obj.user()

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py
Ansheng

Process finished with exit code 0

_del_ 解释器销毁对象时候自动调用,特殊的名:析构方法

封装的应用场景之一就是当同一类型的方法具有相同参数时,直接封装到对象即可。

实例

通过用户输入年龄和姓名输出用户的个人信息

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

class Foo:
    def __init__(self, name, age):
        self.Name = name
        self.Age = age
        
    def info(self):
        print("""
            My name is: %s
            My age is: %d
        """ % (self.Name, self.Age))
        
ansheng = Foo("Ansheng", 18)
ansheng.info()

xiaoming = Foo("xiaoming", 30)
xiaoming.info()

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py

            My name is: Ansheng
            My age is: 18
            
            My name is: xiaoming
            My age is: 30
            
Process finished with exit code 0

封装的应用场景之二就是把类当作模块,创建多个对象(对象内封装的数据可以不一样)

面向对象之继承基础

继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

实例

创建一个信息相关的类,比如说人拥有四肢头发耳朵等信息,在创建一个中国人和外国人的类,中国人的语言是中文,皮肤是黄色,外国人的语言是英文,皮肤是黑色。

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

class People:
    def __init__(self):
        print("""
        你的通用特征有:四肢、头发、眼、耳朵
        """)
        
class China(People):
    def info(self):
        print("""
        你是中国人,你的语言是中文,皮肤是黄色
        """)
        
class Us(People):
    def info(self):
        print("""
        你是美国人,你的语言是英文,皮肤是黑色
        """)
        
c = China()
c.info()

m = Us()
m.info()

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py

        你的通用特征有:四肢、头发、眼、耳朵
        
        你是中国人,你的语言是中文,皮肤是黄色
        
        你的通用特征有:四肢、头发、眼、耳朵
        
        你是美国人,你的语言是英文,皮肤是黑色
        
Process finished with exit code 0

People —> 父类 or 基类

China and Us —> 子类 or 派生类

  1. 派生类可以集成基类中所有的功能
  2. 派生类和积累同时存在,优先找派生类
  3. Python类可以同时继承多个类

面向对象之继承之多继承(新式类)

多继承就是在class My(China, Us):括号内放入多个父类名。

多继承顺序

My(China, Us)时,因为My类中有info这个方法,所以输出的结果是我就是我

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

class China:
    def info(self):
        print("你是中国人")
        
class Us:
    def info(self):
        print("你是美国人")
        
class My(China, Us):
    def info(self):
        print("我就是我")
        
c = My()
c.info()

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py
我就是我

Process finished with exit code 0

My(China, Us)时,My类中没有info这个方法,输出的结果是你是中国人,默认括号内左边的类优先

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

class China:
    def info(self):
        print("你是中国人")
        
class Us:
    def info(self):
        print("你是美国人")
        
class My(China, Us):
    pass
    
c = My()
c.info()

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py
你是中国人

Process finished with exit code 0

My(China, Us)时,My类中没有info这个方法,China类中也没有info这个方法,输出的结果是你是美国人

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

class China:
    pass
    
class Us:
    def info(self):
        print("你是美国人")
        
class My(China, Us):
    pass
    
c = My()
c.info()

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py
你是美国人

Process finished with exit code 0

面向对象之继承之多继承时的查找顺序

  • 顶层两个类没有父类的情况

  • 顶层两个类有父类的情况

#Python全栈之路 #面向对象

时间: 2024-10-13 17:59:13

1Python全栈之路系列之面向基础的相关文章

1Python全栈之路系列之Django初体验

Python全栈之路系列之Django初体验 Django不得不说在Python中是一个非常强大的全栈框架,而且入门也比较简单,只要你学完了基本的Django知识,接着再做一两个项目,不大不小就成,然后你再去学其它的框架你会发现,在那些小而美的框架中,你学起来将非常的快,因为你在学习Django的时候就已经学习并且体验过了Web开发流程,所以会有这么一个现象出现,有些新手朋友在学习Flask.Tornado等小而美的框架时,很多概念不是很理解,比如ORM.路由等,但你学Django就不会出现这种

1Python全栈之路系列之MySQL数据库基本操作

Python全栈之路系列之MySQL数据库基本操作 MySQL数据库介绍 MySQL是一种快速易用的关系型数据库管理系统(RDBMS),很多企业都在使用它来构建自己的数据库. MySQL由一家瑞典公司MySQL AB开发.运营并予以支持.它之所以非常流行,原因在于具备以下这些优点: 基于开源许可发布,无需付费即可使用. 自身的功能非常强大,足以匹敌绝大多数功能强大但却价格昂贵的数据库软件. 使用业内所熟悉的标准SQL数据库语言. 可运行于多个操作系统,支持多种语言,包括 PHP.PERL.C.C

1Python全栈之路系列之Tornado Web框架

Python全栈之路系列之Tornado Web框架 Tornado是一个Python web框架和异步网络库,起初由FriendFeed开发. 通过使用非阻塞网络I/O,Tornado可以支撑上万级的连接,处理长连接, WebSockets,和其他需要与每个用户保持长久连接的应用. Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数

1Python全栈之路系列Web框架介绍

Python全栈之路系列之Web框架介绍 所有的语言Web框架本质其实就是起一个socket服务端,监听一个端口,然后运行起来 Web框架包含两部分,一部分是socket,另外一部分是业务的逻辑处理,根据请求的不同做不同的处理 Python的Web框架分成了两类, 即包含socket也包含业务逻辑处理的(tornado) 不包含socket(框架本身通过第三方模块实现socket)只包含业务逻辑处理(django,Flask) WSGI的全称是Web Server Gateway Interfa

3Python全栈之路系列之基于socket实现文件上传

Python全栈之路系列之基于socket实现文件上传 发布时间:2017年3月16日 00:04 浏览(106) 评论(0) 分类:Python 前言 此处没有前言 粘包 在实现发送文件功能之前我们先来理解下粘包的问题,下面有两张图,我觉得很清晰的就可以理解到了. 正常情况下发送文件 第一步: 客户端把获取到的文件总大小(size=65426)先放到缓冲区,然后发送给服务端 第二步: 此时客户端接收到的文件总大小就是65426 粘包的问题下发送文件 第一步: 客户端把获取到的文件总大小(siz

6Python全栈之路系列之MySQL存储过程

Python全栈之路系列之MySQL存储过程 存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行. 存储过程过接收的参数 参数 描述 in 仅用于传入参数用 out 仅用于返回值用 inout 既可以传入又可以当作返回值 创建存储过程 创建一个简单的存储过程 -- 修改SQL语句的结束符为% delimiter % -- 创建这个存储过程先删除 DROP PROCEDURE IF EXISTS proc_p1 % CREATE PROCEDURE proc_

3Python全栈之路系列之MySQL表内操作

Python全栈之路系列之My SQL表内操作 先创创建一个表用于测试 -- 创建数据库 CREATE DATABASE dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- 创建表 CREATE TABLE `tb` (   `id` int(5) NOT NULL AUTO_INCREMENT,   `name` char(15) NOT NULL,   `alias` varchar(10) DEFAULT NULL,   `ema

8Python全栈之路系列之MySQL触发器

Python全栈之路系列之MySQL触发器 l 对某个表进行增/删/改操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行增/删/改前后的行为. 创建触发器基本语法 插入前 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW BEGIN     ... END 插入后 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON t

3Python全栈之路系列之D

Python全栈之路系列之Django模板 模板是一个文本,用于分离文档的表现形式和内容,模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签).模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档. 如何使用模板系统 在Python代码中使用Django模板的最基本方式如下: 可以用原始的模板代码字符串创建一个Template对象,Django同样支持用指定模板文件路径的方式来创建Template对象; 调用模板对象的render方法,并且传入一套