IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python3学习13--面向对象基础1 -> 正文阅读

[Python知识库]Python3学习13--面向对象基础1

本系列博文基于廖雪峰老师的官网Python教程,笔者在大学期间已经阅读过廖老师的Python教程,教程相当不错,官网链接: 廖雪峰官方网站.请需要系统学习Python的小伙伴到廖老师官网学习,笔者的编程环境是Anaconda+Pycharm,Python版本:Python3.



1.面向对象简介

# 1.面向对象编程程序设计思想--Object Oriented Programming,OOP;
# 2.OOP把对象作为程序的基本单元,一个对象包含数据和操作数据的函数;
# 3.面向过程程序设计:把计算机程序视为一系列的命令集合,即一组函数的顺序执行;
# 4.面向过程把函数切分为子函数,把大块函数切割成小块函数来降低系统的复杂度;
# 5.面向对象程序设计:把计算机程序视为一组对象的集合,每个对象可以接收其他对象发过来的消息,
# 并处理这些消息,计算机程序的执行是一系列消息在各个对象之间传递;

# 实例:处理公司员工的工资表
# 面向过程:
employee1 = {"name": "Willard", "salary": 10000}
employee2 = {"name": "ChenJD", "salary" : 12000}
employee3 = {"name": "LiangXinYu", "salary" : 15000}

# 打印每个员工的工资
def printSalary(employee):
    print("%s : %s" % (employee["name"], employee["salary"]))


print("FUXI Technology员工薪资表")
print("--------------------------")

printSalary(employee1)
printSalary(employee2)
printSalary(employee3)
print("--------------------------")
print("--------------------------")

# 采用面向对象程序设计思想:将employee这种数据结构视为一个对象,
# 这个对象拥有name和salary两个属性(Property);
# 如果要打印一个员工的薪资,先创建这个员工对应的对象,
# 然后给对象发一个printSalary消息,让对象自己把自己的数据打印出来;
# 给对象发消息,即调用对象对应的关联函数,称为对象的方法(Method);

class Employee(object):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        
    def printSalary(self):
        print("%s : %s" % (self.name, self.salary))
        
        
# 创建对象
Willard = Employee("Willard", 10000)
ChenJD = Employee("ChenJD", 12000)
LiangXinYu = Employee("LiangXinYu", 15000)

# 打印薪资
print("面向对象打印员工薪资表")
print("FUXI Technology员工薪资表")
print("--------------------------")

Willard.printSalary()
ChenJD.printSalary()
LiangXinYu.printSalary()

# Tips:
# 1.类(Class)是一种抽象概念,如:Employee,指员工这个概念;
# 2.实例(Instance)是一个个具体的Employee,如:Willard,ChenJD是两个具体的Employee;
# 3.面向对象的设计思想是抽象出Class,根据Class创建Instance;
# 结果输出:
FUXI Technology员工薪资表
--------------------------
Willard : 10000
ChenJD : 12000
LiangXinYu : 15000
--------------------------
--------------------------
面向对象打印员工薪资表
FUXI Technology员工薪资表
--------------------------
Willard : 10000
ChenJD : 12000
LiangXinYu : 15000

2.类和实例

# 1.类是抽象的模板,如:Employee类;
# 2.实例是根据类创建出来的一个个具体的"对象",每个对象拥有相同的方法,但数据可能不同;

# 定义类:
# a.class后面是类名,即Employee,通常大写开头;
# b.类名后面(object),从哪个类继承,没有合适的继承类,则使用object类;
class Employee(object):
    pass

# 创建实例:通过类名+()实现
Willard = Employee()
ChenJD = Employee()

print("创建了Willard实例:",Willard)
print("创建了ChenJD实例:",ChenJD)
print("-------------------------------------------------------------------")

# 给实例变量绑定属性,如:给Willard绑定salary属性;
# 在创建实例时,把必须绑定的属性强制填写,通过定义__init__方法;
Willard.salary = 15000
print("给Willard实例绑定了salary属性:",Willard.salary)

class Employee(object):
    def __init__(self,name,salary):  # self表示创建实例本身
        self.name = name
        self.salary = salary
    
    def printEmployeeSalary(self):
        print("%s : %s" % (self.name, self.salary))
        
# 需要传入对应的参数
Willard = Employee("Willard", 15000)
Willard.printEmployeeSalary()
# 结果输出:
创建了Willard实例: <__main__.Employee object at 0x0000023B08BD4898>
创建了ChenJD实例: <__main__.Employee object at 0x0000023B08BD45C0>
-------------------------------------------------------------------
给Willard实例绑定了salary属性: 15000
Willard : 15000

3.数据封装

# 实例:
class Employee(object):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        
    # 在Employee类中,每个实例拥有自己的name和salary这些数据;
    # 可以通过函数来访问这些数据,如:把员工和对应的薪资打印
    def printSalary(self):
        print("%s : %s" % (self.name, self.salary))
        
    
Willard = Employee("Willard", 15000)

print("Willard实例:")
Willard.printSalary()
print("------------------------------")

# Tips:
# 1.Employee实例本身拥有这些数据,没有必要从外面的函数去访问这些数据,
# 直接在Employee类的内部定义访问数据的函数,这样就把数据封装起来了,
# 这些封装数据的函数是和Employee类本身关联起来的,称为类的方法;

# 2.如Employee类,创建实例需要给出name和salary,但如何打印,在Employee内部实现,
# 这些数据和逻辑被封装起来,调用容易,但不知道内部实现的细节;


# 3.封装可以给Employee类增加新的方法,如:薪资对应工程师等级
class Employee(object):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
    
    def printSalary(self):
        print("%s : %s" % (self.name, self.salary))
        
    def salaryToRank(self):
        if self.salary >= 20000:
            print("Rank A Engineer.")
        elif self.salary >= 15000:
            print("Rank B Engineer.")
        elif self.salary >= 10000:
            print("Rank C Engineer.")
        else:
            print("Rank D Engineer.")

            
Willard = Employee("Willard", 20000)

print("Willard的工资为:")
Willard.printSalary()
print("-----------------------------------")

print("Willard工资对应的工程师等级:")
Willard.salaryToRank()
# 结果输出:
Willard实例:
Willard : 15000
------------------------------
Willard的工资为:
Willard : 20000
-----------------------------------
Willard工资对应的工程师等级:
Rank A Engineer.

4.访问限制

# 1.在Class内部,有属性和方法,外部代码可以直接调用实例变量的方法来操作数据;
# 2.在Employee类的实例中,外部代码可以自由修改一个实例的name和salary属性;
class Employee(object):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
    
    def printSalary(self):
        print("%s : %s" % (self.name, self.salary))
        
Willard = Employee("Willard", 15000)
print("Willard的薪资为:",Willard.salary)
print("---------------------------------------------")

# 外部修改属性
Willard.salary = 20000
print("外部修改salary属性,Willard薪资变为:", Willard.salary)
print("---------------------------------------------")

# 如果要让内部属性不被外部访问,在属性名称前加两个下划线__,
# Python中如果实例变量名以__开头,就变成了私有变量(private),
# 私有变量只能内部访问,外部不能访问;
class Employee(object):
    def __init__(self, name, salary):
        self.__name = name
        self.__salary = salary
    
    def printSalary(self):
        print("%s : %s" % (self.__name, self.__salary))
        
        
Willard = Employee("Willard", 12000)
print("Willard的薪资为:")
Willard.printSalary()
print("---------------------------------------------")
print("---------------------------------------------")

# print("Willard的薪资为:",Willard.__salary)  # 该行代码会抛出错误

# 如果外部代码要获取name和salary,则在Student类增加getName和getSalary方法
class Employee(object):
    def __init__(self, name, salary):
        self.__name = name
        self.__salary = salary
    
    def printSalary(self):
        print("%s : %s" % (self.__name, self.__salary))
        
    # 外部代码获取name和salary的方法
    def getName(self):
        return self.__name
    
    def getSalary(self):
        return self.__salary
    
    # 外部代码修改salary的方法
    def setSalary(self, salary):
        if salary <= 0:
            raise ValueError("Input Error.")
        else:
            self.__salary = salary
            
ChenJD = Employee("ChenJD", 15000)
print("ChenJD的薪资信息为:")
ChenJD.printSalary()
print("---------------------------------------------")

print("ChenJD的薪资为:",ChenJD.getSalary())
print("---------------------------------------------")

ChenJD.setSalary(20000)
print("ChenJD的薪资重新设置:",ChenJD.getSalary())

# Tips:
# 1.在Python中,变量名类似__xxx__,是特殊变量,特殊变量是可以直接访问的,不是private变量;
# 2.以一个下划线开头的实例变量名,如:_name,这样的实例变量外部可以访问,
# 但按照约定俗成的规定,当看到这样的变量时,即"这样的变量虽然可以被访问,但请视为私有变量,不要随意访问";
# 结果输出:
Willard的薪资为: 15000
---------------------------------------------
外部修改salary属性,Willard薪资变为: 20000
---------------------------------------------
Willard的薪资为:
Willard : 12000
---------------------------------------------
---------------------------------------------
ChenJD的薪资信息为:
ChenJD : 15000
---------------------------------------------
ChenJD的薪资为: 15000
---------------------------------------------
ChenJD的薪资重新设置: 20000
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 11:52:10  更:2022-01-28 11:53:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:30:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码