python学习笔记-10

面向对象编程-下

1.私有化属性

语法:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。

使用私有化属性的场景:
1.把特定的一个属性隐藏起来,不让类的外部进行直接调用。
2.不让属性的值随意改变。
3.不让子类继承。
class Person():
    def __init__(self):
        self.name='里斯'
        self.age=30
        pass
    pass
xl=Person()
print(xl.name)
#私有化
class Pri():
    def __init__(self):
        self.__name='李四'  #如此外界就访问不到了,但是在内部可以访问到
        self.age=12
        pass
    def __str__(self):
        return '{}的年龄是{}'.format(self.__name,self.age)
    pass
ll=Pri()
print(ll)
print(ll.__name)

在这里插入图片描述

#私有化
class Pri():
    def __init__(self):
        self.__name='李四'  #如此外界就访问不到了,但是在内部可以访问到
        self.age=12
        pass
    def __str__(self):
        return '{}的年龄是{}'.format(self.__name,self.age)
    pass
class Student(Pri):
    def pri(self):
        print(self.__name)  ##同样的,子类也访问不到私有属性
        pass
    pass
stu=Student()
stu.pri()

在这里插入图片描述
小结:
1.私有化的实例属性和类属性不能在外部直接访问,可以在类的内部随意访问。
2.子类不能继承父类的私有化属性,只能继承父类中公开的属性和行为。
3.如果想将属性私有化,直接在属性名的前面加两个下划线’__'就可以了。
4.私有化属性的值可以在类内部修改。

2.私有化方法

私有化方法即在方法名前面加两个下划线。

class Animal:
    def eat(self):
        print('吃')
        pass
    def run(self):
        print('跑')
        pass
    pass
class Bird(Animal):
    pass
b1=Bird()
b1.eat()
b1.run()
#私有化方法
class Pr():
    def __eat(self):
        print('私有化的吃')
        pass
    def run(self):
        self.__eat()
        print('跑')
        pass
    pass
b2=Pr()
b2.run()
b2.__eat()

在这里插入图片描述

私有化方法一般是类内部调用,子类不能继承,外部不能调用

前面一个单下划线:标识protected类型即保护类型的变量,只能允许其本身与子类进行访问,不能使用from ... import *的方式导入
前后两个双下划线:魔法方法
后面单下划线:避免属性名与python关键字冲突
前面双下划线:私有化,private
#访问私有变量的话一般写两个方法,一个访问一个修改,由方法去控制访问
class Person:
    def __init__(self):
        self.__age=19
        pass
    def get_age(self):   #访问
        return self.__age
    def set_age(self,age):     #修改
        if age<0:  
            print('年龄不能小于0')
            pass
        else:
            self.__age=age
            pass
        pass
    pass
p=Person()
p.set_age(12)
print(p.get_age())
p2=Person()
p.set_age(-1)

在这里插入图片描述

3.属性函数property

若想直接像访问公共属性一样访问私有属性而不是如同上述使用方法访问私有属性,可以使用属性函数。
法一:

#访问私有变量的话一般写两个方法,一个访问一个修改,由方法去控制访问
class Person:
    def __init__(self):
        self.__age=19
        pass
    def get_age(self):
        return self.__age
    def set_age(self,age):
        if age<0:
            print('年龄不能小于0')
            pass
        else:
            self.__age=age
            pass
        pass
    #定义一个类属性,实现通过直接访问属性的形式去访问私有的属性
    age=property(get_age,set_age)
    pass
p=Person()
print(p.age)
p.age=25
print(p.age)

在这里插入图片描述
法二:使用装饰器

#访问私有变量的话一般写两个方法,一个访问一个修改,由方法去控制访问
class Person:
    def __init__(self):
        self.__age=12
    @property   #用装饰器添加属性标识,提供一个getter方法
    def age(self):
        return self.__age
    @age.setter   #提供一个setter方法
    def age(self,parms):   #修改私有属性的值,parms也就是后传入想要修改成的age
        if parms<0:
            print('年龄不能小于0')
            pass
        else:
            self.__age=parms
            pass
        pass
    pass
p1=Person()
print(p1.age)
p1.age=20
print(p1.age)

在这里插入图片描述

4.__new__方法

在这里插入图片描述

5.单例模式

单例模式是常用软件设计模式的一种,目的是确保某一个类中只有一个实例存在。如果希望在某个系统中,某个类只能出现一个实例,整个单例模式就能满足要求。

#创建一个单例对象 基于__new__实现
class DataBaseClass(object):
    def __new__(cls, *args, **kwargs):
        #cls._instance=cls.__new__(cls)   不能使用自己的new方法,容易造成递归死循环,应该调用父类的new方法
        if not hasattr(cls,'_instance'):  #如果不存在就创建
            cls._instance=super().__new__(cls,*args,**kwargs)
        return cls._instance
    pass
db1=DataBaseClass()
print(id(db1))
db2=DataBaseClass()
print(id(db2))   #可以看出来都是一个对象
class DBoptSingle(DataBaseClass):
    pass
d1=DBoptSingle()
print(id(d1))
d2=DBoptSingle()
print(id(d2))   #子类继承后也都是一个

在这里插入图片描述

6.错误与异常处理

有时候代码写错了执行程序的时候,执行到错误代码程序会直接种植报错,这是因为python检测到一个错误时,解释器就无法继续执行了,出现了错误的提示,这就是“异常”。

#语法格式:
try:
	可能出现错误的代码块
except:
	出错之后执行的代码块
else:
	没有出错的代码块
finally:
	不管有没有出错都执行的代码块

将可能出错的代码放到try里面,except可以指定类型捕获异常。except里面的代码是捕获到异常时执行。
#异常处理
try:
    print(b)  #要捕获异常的代码
    pass
except NameError as msg:   #将异常信息输出
    #处理异常,捕获到异常就来这里
    print(msg)
    pass
print('处理好了Name异常')

在这里插入图片描述
如果不是一个类型的异常是不会捕获的

#异常处理
try:
    li=[1,2,3,3]  #要捕获异常的代码
    print(li[10])
    pass
except NameError as msg:
    #处理错误,捕获到错误就来这里
    print(msg)
    pass   
print('处理好了Name异常')

在这里插入图片描述
因为是index异常而不是name异常,所以try-except语句没起到捕获异常的作用。

#异常处理
try:
    li=[1,2,3,3]  #要捕获异常的代码
    print(li[10])
    pass
except NameError as msg:
    #处理错误,捕获到错误就来这里
    print(msg)
    pass
except IndexError as msg:
    print(msg)
    pass
print('处理好了异常')

在这里插入图片描述
这样就捕获到了。

在这里插入图片描述
python中内置的异常类型👆

#异常处理
try:
    li=[1,2,3,3]  #要捕获异常的代码
    print(li[10])
    pass
except Exception as msg:  #可以直接抛出所有异常
    #处理错误,捕获到错误就来这里
    print(msg)
    pass
print('处理好了异常')

在这里插入图片描述Exception可以捕获所有异常。

def A(s):
    return 10/int(s)
def B(a):
    return 2*A(a)
def main():
    try:
        B(0)
        pass
    except Exception as msg:
        print(msg)
        pass
    pass
main()
#不用在每个可能出异常的地方去捕获,可以嵌套捕获

在这里插入图片描述

try:
    print(a)
    pass
except Exception as msg:
    print(msg)
    pass
else:
    print('当没异常我才执行')
    pass
finally:
    print('不管怎样我都会执行')

print('=========================')
try:
    a=1
    print(a)
    pass
except Exception as msg:
    print(msg)
    pass
else:
    print('当没异常我才执行')
    pass
finally:
    print('不管怎样我都会执行')

在这里插入图片描述
自定义异常: 直接或间接继承Error或Exception类,由开发者主动抛出自定义异常,在python中使用raise关键字。

抛出自定义异常:

#自定义异常
class ToolongMyException(Exception):
    def __init__(self,len):
        '''

        :param len: 长度
        '''
        self.len=len
        pass
    def __str__(self):
        return '您输入的数据长度是{},超过长度了'.format(self.len)
    pass
while True:
    name = input('请输入姓名:')
    if len(name) > 5:
        raise ToolongMyException(len(name))
    else:
        print(name)
        pass

在这里插入图片描述
捕获自定义异常:

#自定义异常
class ToolongMyException(Exception):
    def __init__(self,len):
        '''

        :param len: 长度
        '''
        self.len=len
        pass
    def __str__(self):
        return '您输入的数据长度是{},超过长度了'.format(self.len)
    pass
while True:
    name = input('请输入姓名:')
    try:
        if len(name) > 5:
            raise ToolongMyException(len(name))
        else:
            print(name)
            pass
    except ToolongMyException as msg:
        print(msg)
        pass
    else:
        print('没有异常')
    finally:
        print('执行完毕')

在这里插入图片描述

7.Python动态添加属性和方法

动态语言: 在运行时可以改变其结构的语言。

class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        pass
    def __str__(self):
        return '{}的年纪是{}'.format(self.name,self.age)
    pass
s1=Student('学生1',20)
print(s1)
s1.grade=78   #动态增加属性
print(s1.grade)
print('====================')
s2=Student('学生2',22)
print(s2)
print(s2.grade)  #s2就没有,有点像个性化定制

在这里插入图片描述

import types  #动态增加实例方法需要导入的库
def dymicMethod(self):
    print('{}的成绩是:{}在{}读大学'.format(self.name,self.grade,Student.school))
    pass
class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        pass
    def __str__(self):
        return '{}的年纪是{}'.format(self.name,self.age)
    pass
s1=Student('学生1',20)
print(s1)
s1.grade=78   #动态增加属性
print(s1.grade)
print('===================')
Student.school='学校'  #动态增加类属性
print(s1.school)
print('===================')
#动态添加实例方法
s1.printInfo=types.MethodType(dymicMethod,s1)  #dymicMethod是要绑定的方法,s1是要和谁绑定
s1.printInfo()

在这里插入图片描述

class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        pass
    def __str__(self):
        return '{}的年纪是{}'.format(self.name,self.age)
    pass
#给类绑定方法
@classmethod
def classTest(cls):
    print('这是一个类方法')
    pass
Student.Test1=classTest    #绑定类方法
Student.Test1()
@staticmethod
def staticTest():
    print('这是一个静态方法')
    pass
Student.Test2=staticTest   #绑定一个静态方法
Student.Test2()
s1=Student('学生1',20)
print(s1)
print('实例对象调用绑定的方法:')
s1.Test1()
s1.Test2()

在这里插入图片描述

8.__slots__属性

在这里插入图片描述

#__slots__属性
class Student(object):
    __slots__ = ('name','age')
    def __str__(self):
        return '{}....{}'.format(self.name,s1.age)
    pass
s1=Student()
s1.name='名字'
s1.age=22
print(s1)
s1.grade=98  #因为没在slots属性的范围内,所以不能添加这个属性

在这里插入图片描述

正常情况下,类会将所有属性存储在__dict__中,但是定义了slots属性后就都存到slots中了不会存在dict中了

#__slots__属性
class Student(object):
    def __str__(self):
        return '{}....{}'.format(self.name,s1.age)
    pass
s1=Student()
s1.name='s1'
s1.age=22
print(s1.__dict__)
class Student2(object):
    __slots__ = ('name','age')
    def __str__(self):
        return '{}....{}'.format(self.name,s1.age)
    pass
s2=Student2()
s2.name='s2'
s2.age=22
print(s2.__dict__)

在这里插入图片描述

#__slots__属性
class Student(object):
    __slots__ = ('name','age')
    def __str__(self):
        return '{}....{}'.format(self.name,s1.age)
    pass
s1=Student()
s1.name='s1'
s1.age=22
class subStudent(Student):
    pass
s2=subStudent()
s2.grade=24
print(s2.grade)   #并没有报错,没有继承父类的slots属性
class subStudent2(Student):
    __slots__ = ('gra','weight')
    pass
s3=subStudent2()
s3.name='s3'
s3.age=22
s3.gra=21
s3.weight=78
print(s3.name,s3.weight,s3.age,s3.gra)   #继承了父类的slots属性自己发挥了
class subStudent3(Student):
    __slots__ = ()
    pass
s4=subStudent3()
s4.gra=21
print(s4.gra)   #继承了父类的slots属性但是没自己发挥

在这里插入图片描述

9.实践

在这里插入图片描述
9.1 创建person类

class Person():
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
        pass
    def __str__(self):
        return '{}的年龄是{}'.format(self.__name,self.__age)
    def getNameInfo(self):
        return self.__name
    def getAgeInfo(self):
        return self.__age
    def setName(self,name):
        self.__name=name
    def setAge(self,age):
        if age>0 and age<120:
            self.__age=age
        else:
            print('违法')
p1=Person('p1',22)
print(p1)
p1.setAge(123)
p1.setAge(77)
print(p1)

在这里插入图片描述
9.2 创建单例模式

class A(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'_instance'):
        	cls._instance=super().__new__(cls,*args,**kwargs)
        return cls._instance
    pass

9.3 创建类

class A(object):
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
        pass
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,name):
        self.__name=name
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,age):
        self.__age=age
    def __call__(self, *args, **kwargs):    #调用这个实例,让其以函数的形式调用
        print('{}的年纪是{}'.format(self.__name,self.__age))
s1=A('s1',22)
s1()
s1.name='ds'
s1.age=23
s1()

在这里插入图片描述
9.4 创建类

import types
def run(self):
    print('小猫跑')
class Animal:
    pass
Animal.color='三花'
cat=Animal()
cat.run=types.MethodType(run,cat)
cat.run()
print(cat.color)
@classmethod
def Info(cls):
    print('ok')
    pass
Animal.Info=Info
Animal.Info()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/730376.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务开发与实战Day08 - Elasticsearch

一、初始Elasticsearch 高性能分布式搜索引擎 1. 认识和安装 1.1 认识 Lucene是一个Java语言的搜索引擎类库&#xff0c;是Apache公司的顶级项目&#xff0c;由DougCutting于1999年研发。官网地址&#xff1a;Apache Lucene - Welcome to Apache Lucene Lucene的优势&…

RabbitMQ(七)Shovel插件对比Federation插件

文章目录 Shovel和Federation的主要区别&#xff08;重点&#xff09;一、启用Shovel插件二、配置Shovel三、测试1、测试计划2、测试效果发布消息源节点目标节点 Shovel和Federation的主要区别&#xff08;重点&#xff09; • Shovel更简洁一些 • Federation更倾向于跨集群使…

基于JSP技术的个性化影片推荐系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPServlet 工具&#xff1a;MyEclipse、Tomcat、MySQL 系统展示 首页 …

Golang——channel

channel是Go在语言层面提供的协程间的通信方式。通过channel我们可以实现多个协程之间的通信&#xff0c;并对协程进行并发控制。 使用注意&#xff1a; 管道没有缓冲区时&#xff0c;从管道中读取数据会阻塞&#xff0c;直到有协程向管道中写入数据。类似地&#xff0c;向管道…

内网安全[3]-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线

1.环境 隧道技术: 隧道技术是一类网络协议&#xff0c;它是一种数据包封装技术&#xff0c;它将原始IP包&#xff08;其报头包含原始发送者和最终目的地&#xff09;封装在另外一个数据包&#xff08;称为封装的IP包&#xff09;的数据净荷中进行传输&#xff0c;使用隧道的原…

V4和V6双栈处理

现进行双栈 对R1 对R2 对R3 对R4 路由地址配完&#xff0c;起协议 然后起ripng&#xff0c;在R2&#xff0c;R3&#xff0c;R4上都宣告一下 然后在PC1和PC2上都手动配置一下就可以了

第1章 MySQL数据库概述

1.1 基本概念 数据库是什么&#xff1f; 存储数据的地方 DB&#xff1a;数据库&#xff08;Database&#xff09; 为什么要用数据库&#xff1f; 因为应用程序产生的数据是在内存中的&#xff0c;如果程序退出或者是断电了&#xff0c;则数据就会消失。使用数据库是为了…

CVPR上新 | 从新视角合成、视频编解码器、人体姿态估计,到文本布局分析,微软亚洲研究院精选论文

编者按&#xff1a;欢迎阅读“科研上新”栏目&#xff01;“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里&#xff0c;你可以快速浏览研究院的亮点资讯&#xff0c;保持对前沿领域的敏锐嗅觉&#xff0c;同时也能找到先进实用的开源工具。 本周&#xff0…

DLS平台:美联储松绑预期升温,金价飙升至2365美元

摘要 美联储鹰派官员古尔斯比对降息态度有所松动&#xff0c;导致金价一度升至2365美元。市场对美联储未来的货币政策预期有所改变&#xff0c;黄金作为避险资产的吸引力增强。本文将详细分析美联储官员态度变化对金价的影响、当前市场对黄金的预期及其未来走势。 美联储官员态…

Spring Boot中的各种事件

spring boot 各种事件贯穿整个启动的生命周期&#xff0c;读懂了这些事件也差不多理解了springboot的启动流程。 SpringApplicationRunListener中的事件 接口org.springframework.boot.SpringApplicationRunListener定义了spring启动过程中各个事件被触发的顶层方法 public …

JavaScript的学习之强制类型转换

目录 一、什么是强制类型转换 二、其他类型转化为String类型 方式一&#xff1a;调用被转化数据类型的toString()方法 方式二&#xff1a;调用String函数&#xff0c;并将我们要转换的数据添加进去为参数 三、其他类型转化为Number类型 方式一&#xff1a;使用Number()函数…

Python有哪些就业方向?就业市场广阔!

Python是一种跨平台的计算机程序设计语言&#xff0c;是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python语言在人工智能的发展下&#xff0c;越来越多计算机企业开始广泛使用&#xff0c;同时Python的就业方向也逐渐广阔。 YesPMP为学习Python的技术人员…

【环境变量问题:计算机删除环境变量的恢复方法;此环境变量太大。此对话框允许将值设置为最长2047个字符】

不小心误删了win10系统环境变量可以试试下文方法恢复。 本方法针对修改环境变量未重启的用户可以使用&#xff0c;如果修改环境变量&#xff0c;然后还重启了&#xff0c;只能说重新来。 方法一&#xff1a;使用命令提示符恢复 被修改的系统Path只是同步到了注册表中&#x…

QListWidget、QMenu、Action、customContextMenuRequested

QListWidget的初始化、清空、Append添加、Insert添加、删除item QListWidget的事件的使用 QToolBox的使用&#xff0c;每个Page可以添加其他控件 QToolBar使用代码添加QMenu,QMenu添加3个Action QToolButton绑定Action 布局 其中 QSplitter比较特殊&#xff0c; 允许在水平或垂…

策略模式:applicationContext.getBeansOfType()方法

applicationContext.getBeansOfType() 一般用来获取某个接口的所有实例Bean 方法定义如下&#xff1a; 入参一般是接口&#xff0c;即interface。响应是个Map结构&#xff0c;key bean在容器中的名称&#xff0c;value bean实列 开发步骤&#xff1a; 1.定义接口 2.定义…

NGINX_十八 nginx 访问控制

十八 nginx 访问控制 1 nginx 访问控制模块 &#xff08;1&#xff09;基于IP的访问控制&#xff1a;http_access_module &#xff08;2&#xff09;基于用户的信任登录&#xff1a;http_auth_basic_module 2 基于IP的访问控制 2.1 配置语法 Syntax&#xff1a;allow addr…

kettle从入门到精通 第七十二课 ETL之kettle 三谈http post(含文件上传),彻底掌握参数传递

场景&#xff1a;群里有个小伙伴在使用http post步骤调用接口时遇到问题&#xff0c;postman调用正常&#xff0c;但是kettle中调用异常。 解决方案&#xff1a;既然postman调用接口正常&#xff0c;肯定是http post步骤中某些参数设置的不正确导致的。那就把常用的方式都梳理下…

C++11 右值引用和移动语义

目录 1.左值引用和右值引用 2.右值引用使用场景&#xff08;移动语义&#xff09;和意义 3.右值引用引用左值及其一些更深入的使用场景分析 4.完美转发 1.左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现…

云计算考试题

Cloud ❀ 云计算-虚拟化常见的两种架构_裸金属架构和宿主型架构的区别-CSDN博客 为啥要成2 11 bcd 16 acd abcd BCD NAS为啥支持文件存储的协议 选BCD 什么是网络文件系统 选bcd 错题 选abc 选bcd 选 abd

【ARMv8/v9 GIC 系列 4.2 -- GIC CPU Interface 详细介绍】

文章目录 GIC CPU Interface 介绍CPU Interface 主要寄存器 GIC CPU Interface 介绍 A 系列处理器提供 5个管脚来实现中断&#xff0c;分别是&#xff1a; nIRQ&#xff1a;物理普通中断nFIQ&#xff1a;物理快速中断nVIRQ&#xff1a;虚拟普通中断nVFIQ&#xff1a;虚拟快速…