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学习15--面向对象高级1 -> 正文阅读

[Python知识库]Python3学习15--面向对象高级1

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



1.使用__slots__

# 正常情况下定义类
# 1.定义class
class Employee(object):
    pass

# 2.给实例绑定属性
employee1 = Employee()
employee1.name = "Willard"
print("employee1.name属性为:", employee1.name)

# 3.给实例绑定方法
def setSalary(self, salary):
    self.salary = salary
    
from types import MethodType

employee1.setSalary = MethodType(setSalary, employee1)  # 给实例绑定方法
employee1.setSalary(20000)    # 调用实例方法
print("employee1.salary结果为:", employee1.salary)

# Tips:
# a.给一个实例绑定方法,对另外一个实例不起作用;
employee2 = Employee()
# employee2.setSalary(10000)    # 抛出错误
# b.如果要给所有实例绑定方法,则需要给class绑定方法
def setRank(self, rank):
    self.rank = rank
    
Employee.setRank = setRank

employee1.setRank("A")
print("employee1等级:", employee1.rank)

employee2.setRank("B")
print("employee2等级:", employee2.rank)
# 结果输出:
employee1.name属性为: Willard
employee1.salary结果为: 20000
employee1等级: A
employee2等级: B
# 限制实例的属性,如:只允许对Employee实例添加name和salary属性;
# 在定义class时,定义一个特殊的__slots__变量,限制该class实例能添加的属性;
class Employee(object):
    __slots__ = ("name", "salary")
    
    
employee1 = Employee()
employee1.name = "ChenJD"
employee1.salary = 20000
# employee1.rank = "A"    # 限制了只能添加name和salary属性,抛出错误

# Tips:使用__slots__定义的属性仅对当前类实例起作用,对继承的子类不起作用;
class OtherEmployee(Employee):
    pass

otherEmployee1 = OtherEmployee()
otherEmployee1.rank = "A"    # 可以绑定rank属性
print("otherEmployee1可以绑定rank属性:",otherEmployee1.rank)

# 结果输出:
# otherEmployee1可以绑定rank属性: A

2.使用@property

# 绑定参数时,对参数进行检查
class Employee(object):
    def getSalary(self):
        return self._salary
    
    def setSalary(self, value):
        if not isinstance(value, int):
            raise ValueError("Salary must be an integer.")
        if value < 0:
            raise ValueError("Salary must be > 0.")
        self._salary = value
        
        
employee1 = Employee()
employee1.setSalary(20000)
print("employee1.getSalary结果:", employee1.getSalary())

# employee1.setSalary(-100)  # 抛出错误

# 使用@property装饰器
# 1.把一个getter方法变成属性,只需要加上@property;
# 2.@property本身又创建了另外一个装饰器@salary.setter,负责把一个setter方法变成属性赋值;

class Employee(object):
    @property
    def salary(self):
        return self._salary
    
    @salary.setter
    def salary(self, value):
        if not isinstance(value, int):
            raise ValueError("Salary must be integer.")
        if value < 0:
            raise ValueError("Salary must be > 0.")
        self._salary = value
        
        
employee2 = Employee()
employee2.salary = 15000
print("employee2.salary的结果:", employee2.salary)
# employee1.setSalary(-100)  # 抛出错误

# 结果输出:
# employee1.getSalary结果: 20000
# employee2.salary的结果: 15000

3.多重继承

# 设计一个动物分类:Dog(狗)、Bat(蝙蝠)、Parrot(鹦鹉)、Ostrich(鸵鸟);

# 1.按照哺乳动物和鸟类归类
"""
Animal
---Mammal
------Dog
------Bat
---Bird
------Parrot
------Ostrich
"""

# 2.按照能跑和能飞归类
"""
Animal
---Runnable
------Dog
------Ostrich
---Flyable
------Parrot
------Bat
"""

# 采用多重继承分类
# a.主要的类按照哺乳类和鸟类划分
class Animal(object):
    pass

# 大类
class Mammal(Animal):
    pass

class Bird(Animal):
    pass

# 各种动物
class Dog(Mammal, RunnableMixIn):
    pass

class Bat(Mammal, FlyableMixIn):
    pass

class Parrot(Bird, FlyableMixIn):
    pass

# 让Ostrich除了继承Bird,同时继承Runnable,这种设计称为MixIn;
# MixIn目的:给一个类增加多个功能;
class Ostrich(Bird, RunnableMixIn):
    pass

# 添加Runnable和Flyable功能
class RunnableMixIn(object):
    def run(self):
        print("Running...")
    
class FlyableMixIn(object):
    def fly(self):
        print("Flying...")
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:09:59  更:2022-02-03 01:11:35 
 
开发: 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:54:35-

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